强制GC收集JNI代理对象

 2023-01-21    322  

问题描述

当我尽力清洁JNI对象以在用法结束时释放本地内存时,仍然有一些长时间徘徊,浪费系统本机内存.

是否有任何方法强迫GC优先考虑这些JNI代理?

强制GC收集JNI代理对象

我的意思是有一种方法可以使GC专注于特定的物体,即JNI代理?

谢谢.

推荐答案

如果您是在本机代码中分配的内存(并且按扩展为手柄),则它不在JVM的垃圾收集器的范围之外 – 对此无能为力自己的.如果完成后不在本机代码中释放内存,它将泄漏.

如果您指的是访问本机代码的Java对象,则它们是完全正常的对象,当它们变得无法实现时将收集.请注意,如果将Java对象固定在本机代码中(例如,使用GetByteArrayElements,您还必须释放它们(例如,使用ReleaseByteArrayElements).

如果您的本机代码必须在放开Java对象之前释放资源,则Java对象应具有某种形式的Dispose方法,当调用时,该方法将释放本机资源并从进一步使用中无效Java对象.只需调用Dispose方法并让对象引用进行.

一旦最后一件事,我知道一旦加载,就无法卸载本地库.

其他推荐答案

无法将GC”焦点”放在某些类型的对象上.我认为您在最终确定器中清理干净,并且在以下情况下运行最终器.

  • 该对象不再可以到达.
  • GC决定清理JNI代理所在的一代.

这意味着,为了尽可能快地清理资源,您要:

  • 降低了参考文献的范围,因此您的程序不会在不必要的长时间内粘着它们.另外,很少有垃圾收集的旧物体,因此有双重理由确保它们尽可能短的时间.
  • 添加一种手动清理方法,客户代码在使用JNI代理完成后可以调用 – 不要只是让参考文献消散并等待最终器运行.

示例:

class NativeResource {
    private static native long allocate();
    private static native void release(long handle);
    private final long handle;
    private boolean closed = false;
    public NativeResource(){
        handle = allocate();
    }
    /** Deallocates the native resources associated with this proxy. */
    public void close() { 
        if (closed) throw new IllegalStateException("Already closed");
        release(handle); 
        closed = true;
    }
    protected void finalize() throws Throwable {
        try { 
            if (!closed) release(handle);
        } finally {
            super.finalize();
        }
    }
}

// Usage:
NativeResource nr = new NativeResource();
try {
    // Use the resource for something
} finally {
    nr.close(); // Make sure resource is closed even after exceptions
}

其他推荐答案

您的GC心理模型是错误的. GC不会收集对象,然后释放它们.

GC收集活物.然后将所有其他内存定义为免费.

对于带有最终化器的对象和可能分配在堆栈等上的对象的对象有皱纹,但这是具有正确的心理模型.

全局参考(通过JNI获得的持续参考形式)作为对象的根. GC从根部开始,并递归地遵循所有链接找到实时对象.如果删除了全局引用,则将停止将引用对象保持生存.然后,GC可以收回对象使用的内存,但只有没有其他引用,并且仅在后续集合期间.没有一般的方法来为对象的任何特定子集收回内存.

以上所述是小编给大家介绍的强制GC收集JNI代理对象,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26231.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。