Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,如何计算对象对垃圾收集器的合格性?_Java_Garbage Collection - Fatal编程技术网

在Java中,如何计算对象对垃圾收集器的合格性?

在Java中,如何计算对象对垃圾收集器的合格性?,java,garbage-collection,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. } } 在上面的代码中,当到达“GongtoGC”时,有多少对象符合垃圾收集器的条件? 据我所知,args[],b,c

请澄清我的疑问

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.
 }
}
在上面的代码中,当到达“GongtoGC”时,有多少对象符合垃圾收集器的条件? 据我所知,args[],b,c和两个长对象共5个是合格的。但也有人说总共4个。他们说不会在堆中创建两个长对象,而只创建一个


请澄清我的疑问。

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

4个对象[2个B,2个长]将被创建,所有4个对象都将准备好进行GC

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.
 }
}
排队

c = null;//going to gc.

根据Java语言规范第5.1.7节的装箱转换,将有
args的实时引用,因此args不会准备就绪

如果要装箱的值p为真, false,一个字节,一个字符 \u0000至 \u007f,或介于-128和127之间的整数或短数,然后让r1和 r2是 p的任意两个装箱转换的结果。这总是最重要的 r1为最大值的情况
和r2一样

因此,只有当这一原则也适用于1000L的长自动装箱时,才可能是正确的,否则为错误

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

在我看来,你很可能是对的,而你的提问者是错的


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

这有点棘手

“b”、“c”将垃圾收集起来+2

由于权重的值超出范围[-128127],自动装箱将为每个“A”+2分配新的长实例(请参阅)

如果您使用某种反射机制调用B.main,并且没有保存对类B或其方法实例等的引用,那么类A、类B以及所有方法实例等都将被调用。+A_bunch


如果调用程序不使用传入的args数组,则使用args+1

有两个
长的
对象。在将
b
c
设置为
null
之前,可以通过添加这些行进行验证:

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

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

只有4个对象符合gc的条件。
第c行=空//去gc。设置断点并在eclipse中调试代码,它将显示将创建多少个对象。

在某些实现中,long也是自动装箱的。。。看看Long.valueOf(Long)的实现不可能有两个不同的Long对象。检查这个问题是不可能回答的,因为JVM可以自动缓存Long对象,而不仅仅是基于Long类中缓存从-128到127的值的内部缓存。当然,如果你忽略了这个事实,那么Jigar Joshi的回答是正确的。谢谢你的回答。所以在main()执行之后,将有5个。我说得对吗?