首页 > 解决方案 > JVM 堆外内存地址会发生变化吗?

问题描述

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

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

我完全理解这些很难追查,但我们已经开始缩小根本案例的范围。

问题:

如果我做:

base = unsafe.allocateMemory(capacity);

并且,显然,保留base以后的释放,GC可以(以任何方式)参与并选择移动我的本机内存吗?

我知道GC应该对这种内存没有影响,但我正在寻找一种权威的答案。

标签: javagarbage-collectionjvm

解决方案


这将返回一些虚拟地址指针,AFAIKunsafe.allocateMemory只会在malloc内部调用。作为一个堆外内存,显然 GC 不会触及它,如果您稍后Unsafe.freeMemory使用该指针,只发现它移动了,那将是非常糟糕和意想不到的。


推荐阅读