gpt4 book ai didi

java - 使用 sun.misc.Unsafe? 强制释放直接 ByteBuffer 已分配的 native 内存的示例

转载 作者:IT老高 更新时间:2023-10-28 20:46:19 26 4
gpt4 key购买 nike

JDK 提供了分配所谓的直接 ByteBuffers 的能力,其中内存在 Java 堆之外分配。这可能是有益的,因为垃圾收集器不会触及此内存,因此不会增加 GC 开销:这对于缓存等长生命周期事物的属性非常有用。

然而,现有实现存在一个关键问题:只有在对拥有的 ByteBuffer 进行垃圾回收时才异步分配底层内存;没有办法强制提前释放。这可能会产生问题,因为 GC 周期本身不受 ByteBuffers 处理的影响,并且考虑到 ByteBuffers 可能驻留在旧代内存区域中,可能会在 ByteBuffer 不再使用数小时后调用 GC。

但理论上应该可以直接使用 sun.misc.Unsafe 方法(freeMemory、allocateMemory):这是 JDK 本身用于分配/释放 native 内存的方法。查看代码,我看到的一个潜在问题是内存双重释放的可能性——所以我想确保正确清理状态。

谁能指点我这样做的代码?理想情况下希望使用它而不是 JNA。

注意:我看到了 this question这有点相关。

看起来指出的答案是不错的选择:here是来自 Elastic Search 的代码示例,它使用了这个想法。谢谢大家!

最佳答案

有一种更简单的清理内存的方法。

public static void clean(ByteBuffer bb) {
if(bb == null) return;
Cleaner cleaner = ((DirectBuffer) bb).cleaner();
if (cleaner != null) cleaner.clean();
}

如果您相当快地丢弃直接或内存映射的 ByteBuffer,使用它会产生很大的不同。

使用 Cleaner 执行此操作的原因之一是您可以拥有底层内存资源的多个副本,例如与切片()。并且 Cleaner 拥有这些资源的数量。

关于java - 使用 sun.misc.Unsafe? 强制释放直接 ByteBuffer 已分配的 native 内存的示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8462200/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com