如何在Java中计算对象到垃圾收集器的资格?

时间:2011-04-26 05:37:07

标签: java garbage-collection

请澄清我的疑问。

class A{
Long weight = 1000L;
}
public class B extends A{
 public static void main (String[] args){
    B b = new B();
    B c = new B();
    b = null; 
    c = null;//going to gc.
 }
}

在上面的代码中,到达“go to gc”时有多少对象符合垃圾收集器的条件? 据我所知args [],b,c和两个Long对象共5个符合条件。但有些人说完全是4.他们说没有两个Long对象会在堆中创建但只有一个。

请澄清我的疑问。

6 个答案:

答案 0 :(得分:3)

4将创建对象[B中的2个,2个长],并且所有4个都准备好用于GC。

c = null;//going to gc.

会有args的实时参考,因此args不会准备就绪

答案 1 :(得分:1)

根据Java语言规范部分5.1.7拳击转换:

  

如果装箱的值p为真,   false,一个字节,范围内的char   \ u0000到       \ u007f,或-128到127之间的int或短号,然后让r1和   r2是       p的任意两次拳击转换的结果。它始终是   r1是的情况       与r2相同。

因此,只有当这个原则适用于1000L的长自动装箱时才会成立,否则就是假的。

这可能是问题的前提,但JLS似乎不包括长自动装箱,数字都不超过127,

有可能你是对的,你的提问者在我看来是错的。

无论如何,我只是想指出,在JLS中规定的条件下,自动装箱可能会出现问题。你问题的条件不符合要求,因此我同意你的对象数量。

答案 2 :(得分:0)

好吧,如果b.weight == c.weight那么答案是4.否则,答案是5.试试看看。

答案 3 :(得分:0)

这有点棘手。

'b','c'收集垃圾。的 2

由于权重值超出范围[-128,127],自动装箱将为每个'A' +2 分配新的Long实例(参见http://www.jdocs.com/harmony/5.M5/java/lang/Long.html#823

如果您使用某种反射机制调用B.main,并且没有对B类或其Method实例等的引用,那么A类,B类以及所有Method实例等 + a_bunch

如果调用者没有使用传入的args数组,那么args;的 1

答案 4 :(得分:0)

有两个Long个对象。您可以在将bc设置为null之前添加以下行进行验证:

System.out.println(System.identityHashCode(b.weight));
System.out.println(System.identityHashCode(c.weight));

您将获得两个不同的身份哈希码,这意味着它们是两个不同的对象。

答案 5 :(得分:0)

只有4个对象符合gc条件。  at c = null; //转到gc。设置断点并在eclipse中调试代码,它将显示将创建多少个对象。