可能重复:
你有没有在任何项目中使用Phantom参考?
我已经阅读了不同类型的参考资料.我理解强大,软弱的参考是如何运作的.
但是,当我读到幻影参考时,我无法理解它们.也许是因为我找不到任何好的例子来告诉我他们的目的是什么或何时使用它们.
你能告诉我一些使用幻像参考的代码示例吗?
我有一个Swing浏览器应用程序,其中有一个错误,当我向GUI添加/删除内存时,没有为这些对象释放内存,而我正在尝试追踪保留它们的内容.问题是我不知道如何判断什么东西实际上已从内存中完全释放.
有没有办法判断对象是否已从内存中释放?我已经习惯了Objective-C,有几种方法可以讲述.
谢谢
适用于PhantomReference的 Javadoc 8 指出:
与Java终结机制相比,虚拟引用最常用于以更灵活的方式调度事前清理操作。
因此,我尝试创建一个线程,该线程正在调用close()符合垃圾回收条件的Test Object方法。在run()试图获得所有测试对象的预验。
实际上,检索到的测试对象都是null。预期的行为是检索测试对象并调用该close方法。
无论创建多少个测试对象,都不会在验尸前捕获单个测试对象(您必须增加超时并多次调用GC)。
我究竟做错了什么?这是Java错误吗?
我试图创建一个最小,完整和可验证的示例,但是它仍然很长。我java version "1.8.0_121"在Windows 7 64位上使用32位。
public class TestPhantomReference {
public static void main(String[] args) throws InterruptedException {
// Create AutoClose Thread and start it
AutoCloseThread thread = new AutoCloseThread();
thread.start();
// Add 10 Test Objects to the AutoClose Thread
// Test Objects are directly eligible for GC
for (int i …Run Code Online (Sandbox Code Playgroud) java garbage-collection phantom-reference finalize finalizer
Java允许编写:
new PhantomReference(new Object(), null)
Run Code Online (Sandbox Code Playgroud)
在这种情况下new Object()将被收集?
据我了解,幻影引用是finalize() 方法使用的替代方法。
在队列中出现引用后,我需要执行一些其他操作,然后运行 clear()
Java Doc保留:
可以使用空队列创建幻影引用,但是这种引用完全没有用:其get方法将始终返回null,并且由于它没有队列,因此永远不会入队。
如果它永远不会被排队,那意味着什么?
据我了解,这意味着在完成方法调用后,引用不会再添加到referenceQueue中。因此可能导致:
1.对象存储器将立即被清除
2.对象存储器将不会被清除
哪种情况正确?
Java中有四种类型的引用:强,弱,弱和幻像.请详细说明Java在何处以及如何使用幻像引用.
编辑:
我确实读过javaDoc,就像下面发布的assylias一样.该部分说,如果一个物体已经完成并且有一些幻象参考指向它,那么这个物体就是幻像可重复的.我完全得到了这个说法.
幻影有什么用?我们在哪些情况下使用它?