直到今天,我才意识到 Java 有四种主要的引用类型。
\nJava。GC即使有足够的内存,也会在下次运行时回收该对象\xe2\x80\x99s内存。GC只有当它急需一些内存时才回收这个对象\xe2\x80\x99s内存。reference queue。我理解了基本概念,并编写了一个小程序来理解每种引用类型的工作原理。
\nimport java.lang.ref.PhantomReference;\nimport java.lang.ref.ReferenceQueue;\nimport java.lang.ref.SoftReference;\nimport java.lang.ref.WeakReference;\n\nclass User \n{ \n public User info() \n { \n System.out.println("Info method invoked from User class");\n return null;\n } \n} \n\npublic class ReferencesExample \n{ \n public static void main(String[] args) \n { \n //Strong Reference\n User userRefObj = new User(); \n System.out.println("1 :" …Run Code Online (Sandbox Code Playgroud) Java允许编写:
new PhantomReference(new Object(), null)
Run Code Online (Sandbox Code Playgroud)
在这种情况下new Object()将被收集?
据我了解,幻影引用是finalize() 方法使用的替代方法。
在队列中出现引用后,我需要执行一些其他操作,然后运行 clear()
Java Doc保留:
可以使用空队列创建幻影引用,但是这种引用完全没有用:其get方法将始终返回null,并且由于它没有队列,因此永远不会入队。
如果它永远不会被排队,那意味着什么?
据我了解,这意味着在完成方法调用后,引用不会再添加到referenceQueue中。因此可能导致:
1.对象存储器将立即被清除
2.对象存储器将不会被清除
哪种情况正确?
我试着理解课堂 ReferenceQueue
它是可选的构造函数参数
SoftReference
Run Code Online (Sandbox Code Playgroud)
和
WeakReference
Run Code Online (Sandbox Code Playgroud)
它也是 的强制性参数PhantomReference。
根据我读过的信息,我可以写一些论文
a) 对于 PhantomReference 方法 get 总是返回 null
b)
对于 Phantom 引用:
1. gc 检测到该对象可以从内存中删除
2. 对放入 ReferenceQueue 的对象的引用,
当我们调用 clear 或 link to reference from queue 时无法访问并且 gc 看到 3. finalize 方法调用
4.
为弱/软引用释放内存:
1. gc 检测到该对象可以从内存中删除
2. 终结方法调用
3. 释放内存
4. 对放入队列的对象的引用
XXXReference构造函数?PhantomReference没有没有构造函数ReferenceQueue?