虽然我尽力清理JNI对象以释放使用结束时的本地内存,但仍有一些对象会在系统本地内存中占用很长时间,浪费资源。
有没有办法强制GC优先回收这些JNI代理对象呢?
我的意思是,是否有一种方法可以使GC集中处理某种特定类型的对象,即JNI代理对象?
谢谢。
虽然我尽力清理JNI对象以释放使用结束时的本地内存,但仍有一些对象会在系统本地内存中占用很长时间,浪费资源。
有没有办法强制GC优先回收这些JNI代理对象呢?
我的意思是,是否有一种方法可以使GC集中处理某种特定类型的对象,即JNI代理对象?
谢谢。
无法让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
}