我们有一个平台,高度依赖JVM中的堆外内存。我们注意到,在GC周期中,我们有时会得到SIGSEGV:
V [libjvm.so+0x5c56cf] G1ParScanThreadState::copy_to_survivor_space(InCSetState, oopDesc*, markOopDesc*)+0x4bf
我完全理解很难找到这些,但是我们已经开始缩小根源范围。
问题:
如果我这样做:
base = unsafe.allocateMemory(capacity);
,并且显然保留base
以便以后释放,GC是否可以(以任何方式)介入并选择移动我的本机内存?
我知道GC对这种内存没有影响,但是我正在寻找一种权威的答案。
答案 0 :(得分:3)
这将返回一些虚拟地址指针,并且AFAIK private static double round(double value, int places) {
if (places < 0) throw new IllegalArgumentException();
BigDecimal bd = new BigDecimal(Double.toString(value));
bd = bd.setScale(places, RoundingMode.HALF_UP);
return bd.doubleValue();
}
...
tip =(charge * TIP_PERCENTAGE) ;
tip = round(tip,2);
仅在内部调用502 Bad Gateway
。作为堆内存,显然,GC不会触摸它,如果以后使用该指针unsafe.allocateMemory
来仅发现它已移动,那将是非常糟糕和意外的。