JVM离堆内存地址是否会发生变化?

3

我们有一个平台,严重依赖于JVM中的堆外内存。我们注意到,在GC周期期间,不时会出现SIGSEGV:

V  [libjvm.so+0x5c56cf]  G1ParScanThreadState::copy_to_survivor_space(InCSetState, oopDesc*, markOopDesc*)+0x4bf

我完全理解这些问题很难追踪,但我们已经开始缩小根本原因。

问题:

如果我执行:

base = unsafe.allocateMemory(capacity);

显然,要稍后释放base,那么GC会不会以任何方式介入并选择移动我的本地内存呢?

我知道GC不应该对这种类型的内存产生影响,但我正在寻找某种权威的答案。

1个回答

3

这将返回一些虚拟地址指针,据我所知 unsafe.allocateMemory 只是在内部调用 malloc。由于它是一个 非堆内存,显然 GC 不会触及到它,如果你稍后使用 Unsafe.freeMemory 释放该指针,只发现它已经移动,那将是非常糟糕和意外的。


太好了,这正是我所希望得到的。非常感谢! :) - Jovan Perovic
1
@JovanPerovic 为了更加确定:http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/sun/misc/Unsafe.java#l464 - maaartinus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接