java - JVM 堆外内存地址会发生变化吗?
问题描述
我们有一个平台严重依赖 JVM 中的堆外内存。我们注意到,有时我们会在 GC 周期内得到 SIGSEGV:
V [libjvm.so+0x5c56cf] G1ParScanThreadState::copy_to_survivor_space(InCSetState, oopDesc*, markOopDesc*)+0x4bf
我完全理解这些很难追查,但我们已经开始缩小根本案例的范围。
问题:
如果我做:
base = unsafe.allocateMemory(capacity);
并且,显然,保留base
以后的释放,GC可以(以任何方式)参与并选择移动我的本机内存吗?
我知道GC应该对这种内存没有影响,但我正在寻找一种权威的答案。
解决方案
这将返回一些虚拟地址指针,AFAIKunsafe.allocateMemory
只会在malloc
内部调用。作为一个堆外内存,显然 GC 不会触及它,如果您稍后Unsafe.freeMemory
使用该指针,只发现它移动了,那将是非常糟糕和意想不到的。
推荐阅读
- python - 使用 Excel Pandas 中的浮点值填充字典的问题
- vue.js - 通过关键参数保持活动视图路由器
- react-native - react-navigation A right-aligned drawerLabel
- android - Windows - Android studio 通过快捷方式打开项目
- python - list.clear() 与 list = [] 有何不同?
- php - SQL WHERE CONCAT LIKE NOT
- firebase - Firestore 错误 - 查询需要索引,但索引可能不可行?
- java - 带“或”的动态参数
- javascript - 如何为 Angular 2+ 通用定义全局虚拟文档对象?
- dc.js - remove_empty_bins 不适用于 crossfilter 中的 elasticX