2017-10-20 107 views
11

我有一个内存区域包裹着JNI NewDirectByteBuffer。我想在ByteBuffer的清洁程序中运行免费/发布代码。有没有办法做到这一点,或者我必须提供一个自定义的免费方法,用户将不得不打电话给ByteBuffer释放内存与NewDirectByteBuffer包装

编辑

为了澄清,我分配的内存自己,并呼吁NewDirectByteBuffer自己。我想知道我应该如何协调清洁工的清理工作。

+2

在Java 8的DirectByteBuffer中,您可以调用Cleaner.clean()方法,虽然它不是公共API,所以请使用它,因为它不是可移植的。 –

+0

@PeterLawrey这将永远调用free()吗?如果我需要其他清理功能而不是free()? –

+0

它将执行任何适当的操作来释放内存。您没有任何证据表明涉及调用'free()'。 – EJP

回答

2

您使用JNI.newDirectByteBuffer,你可以和你应该手动释放内存,并且你在同一时间清理工作。

如果你想自动清理,你需要的是监视对象的生命周期。如果您只想使用API​​并且不使用反射,则可以使用PhantomReferenceReferenceQueue,并创建一个恶意线程来轮询队列。参考队列中的参考资料一旦完成,请清理工作。

+0

请阅读该问题。我没有使用'ByteBuffer.allocateDirect',我使用JNI中的'NewDirectByteBuffer'。因为'NewDirectByteBuffer'不带一个自由函数指针,所以JVM无法知道如何释放内存区域。 '免费'可能适用也可能不适用。 –

+0

'NewDirectByteBuffer'返回一个'DirectByteBuffer'类型的jobject。所以解决方案是一样的,但从更换清洁剂来创建清洁剂。 –

+0

那么你如何控制被调用的自由函数呢? –