【问题标题】:Are objects in string constant pool eligible for garbage collection? [duplicate]字符串常量池中的对象是否有资格进行垃圾回收? [复制]
【发布时间】:2018-07-19 22:54:14
【问题描述】:

计算方法完成后有多少对象可以进行垃圾回收?

我已经搜索过这个问题,答案都是 1。

public void compute(Object p)

    {

     Object a = new Object();

     int x = 100;

     String str = "abc";

    }

但据我所知,字符串常量池现在是 Java 7 中堆的一部分,可以进行垃圾回收。

据我所知,有 2 个对象符合垃圾回收条件,即 astr

【问题讨论】:

  • 您的部分困惑是您对 variablesobjects 的误解:astr 只是变量,可能只引用一些对象(或者可能不是)。另一方面,被引用的对象可能符合 GC 条件。
  • @kayamen,所以基本上你的意思是 str 也会被垃圾收集?根据您分享的链接的建议

标签: java string


【解决方案1】:

在哪里创建对象并不重要。

唯一重要的是:对象是否活着

换句话说:当对象的最后一个引用不再使用(或该引用的持有者不再活动)时,该对象就有资格进行垃圾回收。

无法再访问在方法中本地创建的对象 - 当方法返回时它不再存在。例如,如果该方法将 a 添加到某个(仍然存在的)“全局”列表中,情况就会有所不同。

关于str,有多种误解:

  • 没有创建 String 对象:字符串文字进入 constant 池。例如,如果您使用了new String("abc"),那将是另一回事。在您的情况下:没有对象,因此该字符串没有垃圾收集。
  • str 持有引用。没有针对引用的垃圾收集,仅针对对象。

【讨论】:

  • 这个问题中的小代码 sn-p 显示了 2 个可能符合 GC 条件的对象!在方法的第一行中新创建的。第三行中的字符串"abc"。我认为,我们应该解释一下,为什么后者没有资格获得 GC。
  • @Seelenvirtuose 完成 ;-)
  • 只是吹毛求疵:字符串文字"abc" 一个对象。它根本不驻留在堆上!表达式new String("abc") 实际上处理两个 对象。
  • @Seelenvirtuose 确保它驻留在堆上,从 Java 7 开始。
  • @Seelenvirtuose,这是否意味着GC不会发生在SCP区域。 ?如果不是,那么如果我做 str=null; SCP中的悬空物体会发生什么?
猜你喜欢
  • 2013-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多