在执行M1=null;
M2=null;
之后,我很难理解。有多少对象有资格进行垃圾收集?
public class MyTest {
MyTest m;
void show() {
System.out.println("Hello this is show method.");
}
public static void main(String args[]) {
MyTest m1 = new MyTest();
MyTest m2 = new MyTest();
MyTest m3 = new MyTest();
m1.m = m2;
m2.m = m3;
m3.m = m1;
m1 = null;
m2 = null;
// Question here: How many objects will be eligible for garbage collection?
}
}
零。
对象引用图如下所示:
您可以看到引用是循环的。从main
到m3
的引用使m3
对象保持活动状态。反过来,M3
保持活动M1
,这将M2
与GC保持联系。
请注意,如果将m3
设置为null
,则所有三个对象都将同时符合GC条件,尽管它们中的每一个都存在循环引用。GC足够聪明,可以找出所有引用都来自符合GC条件的对象,并收集这三个对象。
根据这个问题的答案,在第11行没有符合GC条件的对象;但是根据我的说法,至少有一个对象t2,它在第6行被设置为指向null,应该有资格进行垃圾回收。
在下面的代码中,假设调用了。最初引用的对象在哪一点/哪一行符合垃圾收集的条件? 如果或有一个公共、受保护、默认或静态的访问修饰符,它会影响对象在什么点上有资格进行垃圾收集吗?如果是,它会受到什么影响? 我的第一个想法是,当测试对象有资格进行垃圾收集时,该对象有资格进行垃圾收集
当Tester类的主方法结束时,有多少对象符合垃圾收集的条件?我的印象是答案是两个,尤其是a1,b1。然而,我找到了一个正确的答案,那就是只有一个对象是合格的。我认为,由于我们没有将b1指定为a2中的成员变量,b1在主要结束之前被分配为null,所以应该由垃圾收集器收集。什么是真的?
问题内容: 我是Java的新手。我现在正在学习WeakReference的概念。我遇到一个可能看起来很愚蠢的问题,但我只是想找出原因。问题是:根据Java文档,“弱引用对象,它们不会阻止对其引用进行最终化,最终确定和回收”。 所以我做了这个小测试: 但是,我注意到在GC运行之后,仍然可以返回我期望为null的对象,并且该方法未被调用。那么出了什么问题?感谢您的提前帮助!:) 问题答案: 测试的前提
问题内容: 在Java中,我做了很多类似的事情而没有考虑太多: 但是,最近我不确定这样做是否安全。毕竟,在对象创建之后就没有对它的引用了(嗯,有引用,但是这个值吗?),所以看起来存在垃圾回收器可能会在执行过程中删除该对象的危险的东西。因此,该方法应如下所示: 现在,我很确定第一个版本可以使用,并且我从未遇到任何问题,但是我想知道在所有情况下这样做是否安全(不仅在特定的JVM中,而且最好根据语言规范
问题内容: 我有一个Java应用程序正在泄漏内存。我知道在垃圾回收期间哪些对象没有被释放,但是我无法确定引用它们的对象。 JVM内部保存的对象图是否具有某种可见性? 否则就有可能找出哪些对象引用了另一个对象? 问题答案: 在真正的基础上,您可以使用命令jhat和jmap从正在运行的Java进程中读取堆文件,然后对其进行处理- 它在本地端口上启动小型Web服务器。它并不是很容易阅读,但是您不必购买分