请澄清我的疑问。
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对象会在堆中创建但只有一个。
请澄清我的疑问。
答案 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
个对象。您可以在将b
和c
设置为null
之前添加以下行进行验证:
System.out.println(System.identityHashCode(b.weight));
System.out.println(System.identityHashCode(c.weight));
您将获得两个不同的身份哈希码,这意味着它们是两个不同的对象。
答案 5 :(得分:0)
只有4个对象符合gc条件。 at c = null; //转到gc。设置断点并在eclipse中调试代码,它将显示将创建多少个对象。