代码之家  ›  专栏  ›  技术社区  ›  Jovan Perovic

JVM堆外内存地址是否可能更改?

  •  3
  • Jovan Perovic  · 技术社区  · 6 年前

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

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

    我完全理解这些很难找到,但我们已经开始缩小问题的范围。

    问题是:

    如果我这样做了:

    base = unsafe.allocateMemory(capacity);
    

    而且,很明显,保留 base

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

    1 回复  |  直到 6 年前
        1
  •  3
  •   Eugene    6 年前

    它将返回一些虚拟地址指针和AFAIK unsafe.allocateMemory 我会打电话的 malloc 非堆存储 显然,GC不会触及内存,如果您稍后再这样做,那将是非常糟糕和意外的 Unsafe.freeMemory 用那个指针,只发现它移动了。