繁体   English   中英

关于GC的问题

[英]A question about GC

这是一个来自java考试的问题,

在#1有多少个物品可以进行gabage收集?

public class Main   {

Integer x = 32768;
public static void main(String[] args)
{ 
    Main m = new Main();
    m = null;
    // #1
  } 
}

我以为它只收集整数x,GC甚至收集主要对象m?

是的,它确实收集了主要对象。 由于整数既不是一个单独的对象(它是Main的成员)而不是指针,它不会被单独收集,而只是作为Main的一部分。

垃圾收集器可能会删除两个对象。

分配给m的对象不再可访问,Main内部的Integer也不可访问。

编辑:您可以问自己:“此时我是否有可能以某种方式访问​​该对象?” 如果回答是“否”,垃圾收集器可能会删除它。

您可能会遇到的一点困惑是,即使存在主要对象,也可以调用main方法。 那是因为它是一种静态方法。 类似地,“整数x”仅作为主对象中的字段存在。 因此,当您创建一个新的Main对象时,您还可以创建整数mx作为m的一部分。 然后,当您将m设置为null时,之前由m引用的对象是垃圾并且可以被收集。

现在,什么时候收集它是一个完全不同的问题。 真的没有保证; 然而,由于它的使用是如此本地化,它几乎肯定会在下一个小的收集/清除/选择你喜欢的术语。

它可以。 没有对它的引用,因此它有资格进行垃圾回收。

Main的实例有资格进行垃圾回收, 通常 Integer也符合条件。 但是,如果配置为Integer类,也可以缓存Integer实例(请参阅此答案 )。

通常,当使用Integer#valueOf(int) (用于自动装箱)时,只缓存介于-128和127之间的整数,但可以通过设置系统属性java.lang.Integer.IntegerCache.high来增加上限。

我使用最近的一个OpenJDK的观察表明,只有一个方法退出做任何引用,它实际上会被收集。 我根本没想到这一点,但事情发生了。 将这些代码行提取到另一个方法中,然后返回main(), 确实允许收集实例。

我认为这是一个愚蠢的问题。 (编辑:我的意思是考试问题!不是侮辱提交者!)这就是你如何定义“合格”的。 就我而言,我会说一次没有留下引用,该实例是有资格进行收集,这只是它从不实际上将被收集,直到方法返回后的某个时候。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM