我们有一个平台严重依赖 JVM 中的堆外内存。我们注意到,有时我们会在 GC 周期中收到 SIGSEGV:
V [libjvm.so+0x5c56cf] G1ParScanThreadState::copy_to_survivor_space(InCSetState, oopDesc*, markOopDesc*)+0x4bf
我完全理解这些很难追踪,但我们已经开始缩小根本案例的范围。
问题:
如果我这样做:
base = unsafe.allocateMemory(capacity);
显然,保留 base
以供以后释放,GC 是否可以(以任何方式)介入并选择移动我的 native 内存?
我知道GC应该对这种内存没有影响,但我正在寻找对此的权威答案。
最佳答案
这将返回一些虚拟地址指针和 AFAIK unsafe.allocateMemory
只会在内部调用 malloc
。作为一个 堆外 内存,显然 GC 不会触及它,如果您稍后对该指针执行 Unsafe.freeMemory
以仅查找,那将是非常糟糕和意外的它移动了。
关于java - JVM 堆外内存地址可能会发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52116139/