2023-01-21 322
当我尽力清洁JNI对象以在用法结束时释放本地内存时,仍然有一些长时间徘徊,浪费系统本机内存.
是否有任何方法强迫GC优先考虑这些JNI代理?
我的意思是有一种方法可以使GC专注于特定的物体,即JNI代理?
谢谢.
如果您是在本机代码中分配的内存(并且按扩展为手柄),则它不在JVM的垃圾收集器的范围之外 – 对此无能为力自己的.如果完成后不在本机代码中释放内存,它将泄漏.
如果您指的是访问本机代码的Java对象,则它们是完全正常的对象,当它们变得无法实现时将收集.请注意,如果将Java对象固定在本机代码中(例如,使用GetByteArrayElements,您还必须释放它们(例如,使用ReleaseByteArrayElements).
如果您的本机代码必须在放开Java对象之前释放资源,则Java对象应具有某种形式的Dispose方法,当调用时,该方法将释放本机资源并从进一步使用中无效Java对象.只需调用Dispose方法并让对象引用进行.
一旦最后一件事,我知道一旦加载,就无法卸载本地库.
无法将GC”焦点”放在某些类型的对象上.我认为您在最终确定器中清理干净,并且在以下情况下运行最终器.
这意味着,为了尽可能快地清理资源,您要:
示例:
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/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态