我们有一个在JVM中严重依赖堆外内存的平台。我们注意到,在GC循环中,我们不时会得到SIGSEGV:
V [libjvm.so+0x5c56cf] G1ParScanThreadState::copy_to_survivor_space(InCSetState, oopDesc*, markOopDesc*)+0x4bf
我完全理解这些很难找到,但我们已经开始缩小问题的范围。
问题是:
如果我这样做了:
base = unsafe.allocateMemory(capacity);
而且,很明显,保留 base
base
我知道GC应该对这种记忆没有影响,但我正在寻找一种权威的答案。
它将返回一些虚拟地址指针和AFAIK unsafe.allocateMemory 我会打电话的 malloc 非堆存储 显然,GC不会触及内存,如果您稍后再这样做,那将是非常糟糕和意外的 Unsafe.freeMemory 用那个指针,只发现它移动了。
unsafe.allocateMemory
malloc
Unsafe.freeMemory