如何检测Java对象的GC调用的最佳方法?
我正在为C ++代码构建一个Java Wrapper,每次调用GC时我都需要释放在C ++代码中分配的内存。
我看到了一些解决方案,但没有一个让我满意。
其中一个是:
Object obj = null;
try{
obj = new Object();
// do things
} finally {
if(obj != null){
obj.freeCObjects();
}
}
答案 0 :(得分:2)
您可能需要考虑java.lang.Object
上提供的finalize()方法。
It is called by the garbage collector on an object when garbage collection determines
that there are no more references to the object.
通常,最好避免使用终结器,因为JVM不保证在任何对象上都调用finalize()
,但是当需要清理本机(通常是非Java)资源时,终结者可能很有用。
这是一个简单的例子:
Object obj = new Object() {
@Override
protected void finalize() throws Throwable {
System.out.println("finalize object");
super.finalize();
}
};
垃圾收集可以调用终结器 。
答案 1 :(得分:1)
没有可靠的方法只使用垃圾收集器。通常的方法(例如,由SWT UI工具包使用,使用本机组件)是要求客户端在对象上调用dispose
或destroy
方法。
答案 2 :(得分:0)
每次运行GC时,您都不太可能想要释放内存。运行GC时,您更有可能想要释放未使用对象的内存。
您可以通过提供一个包含finalize()实现的包装器来释放资源。丢弃包装器时,可以清理资源。如果你真的想让它在每个GC上消失,你可以将WeakReference保存到包装器中。
BTW OpenJDK / Oracle HotSpot JVM具有另一种更轻量级的机制来释放资源。这涉及使用未添加到终结队列的Cleaner对象(意味着可以更快地释放)请参阅以清洁程序为例的直接ByteBuffer。