gpt4 book ai didi

java - Java 中的 GC.AddMemoryPressure 等价物

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:26:18 24 4
gpt4 key购买 nike

项目:Java、JNI (C++)、Android。

我将通过创建一个托管包装类来管理 native C++ 对象的生命周期,该包装类将持有一个指向 native 对象的指针(作为长成员),并将在其重写的 finalize() 方法中删除 native 对象。参见 this question了解详情。

C++对象不消耗其他类型的资源,只消耗内存。该对象的内存占用不是特别高,但本质上高于Java中的64位long。有什么方法可以告诉 Java 的 GC,我的包装器不仅仅负责一个 long 值,而且在运行垃圾收集之前创建数百万个这样的对象不是一个好主意吗?在 .NET 中有一个 GC 的 AddMemoryPressure () 方法,正是为了这个目的而存在的。 Java 中有等效项吗?

最佳答案

经过更多谷歌搜索,我找到了一个 good article来自 IBM 研究中心。

简而言之,他们建议对 native 对象使用 Java 堆而不是 native 堆。通过这种方式,JVM 垃圾收集器上的内存压力对于通过句柄从 Java 代码引用的 native 对象而言更加真实。

为此,需要覆盖默认的 C++ 堆分配和释放函数:operator new 和 operator delete。在 operator new 中,如果 JVM 可用(已调用 JNI_OnLoad),则调用 NewByteArray 和 GetByteArrayElements,返回所需的已分配内存。为了保护创建的 ByteArray 不被垃圾收集,还需要为其创建一个 NewGlobalRef,并将其存储在例如在同一个分配的内存块中。在这种情况下,我们需要分配尽可能多的内存,加上引用的内存。在运算符删除中,需要删除全局引用和释放字节数组元素。如果 JVM 不可用,则使用 native malloc 和自由函数代替。

关于java - Java 中的 GC.AddMemoryPressure 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6716582/

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