释放原生对象

时间:2013-10-31 20:18:47

标签: java c++ memory java-native-interface wrapper

如何检测Java对象的GC调用的最佳方法?

我正在为C ++代码构建一个Java Wrapper,每次调用GC时我都需要释放在C ++代码中分配的内存

我看到了一些解决方案,但没有一个让我满意。

其中一个是:

Object obj = null;
try{
    obj = new Object();
    // do things
} finally {
   if(obj != null){
      obj.freeCObjects();
   }
}

3 个答案:

答案 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工具包使用,使用本机组件)是要求客户端在对象上调用disposedestroy方法。

答案 2 :(得分:0)

每次运行GC时,您都不太可能想要释放内存。运行GC时,您更有可能想要释放未使用对象的内存。

您可以通过提供一个包含finalize()实现的包装器来释放资源。丢弃包装器时,可以清理资源。如果你真的想让它在每个GC上消失,你可以将WeakReference保存到包装器中。

BTW OpenJDK / Oracle HotSpot JVM具有另一种更轻量级的机制来释放资源。这涉及使用未添加到终结队列的Cleaner对象(意味着可以更快地释放)请参阅以清洁程序为例的直接ByteBuffer。