【问题标题】:weak reference to String pool Object对字符串池对象的弱引用
【发布时间】:2013-07-03 08:57:05
【问题描述】:

当我在 wikipedia http://en.wikipedia.org/wiki/Weak_reference 上阅读以下示例代码时

import java.lang.ref.WeakReference;


    public class ReferenceTest {
            public static void main(String[] args) throws InterruptedException {

                WeakReference r = new WeakReference(new String("I'm here"));
                WeakReference sr = new WeakReference("I'm here");
                System.out.println("before gc: r=" + r.get() + ", static=" + sr.get());
                System.gc();
                Thread.sleep(100);

                // only r.get() becomes null
                System.out.println("after gc: r=" + r.get() + ", static=" + sr.get());

            }
    } 

输出 在 gc 之前:r=我在这里,静态=我在这里 gc 后:r=null, static=我在这里

gc 后的输出看不懂,sr(WeakReference) 对字符串池中字符串的强引用在哪里

【问题讨论】:

  • @ManishDoshi 如果您无法对这个问题发表有用的评论,您应该咨询 Javadoc 并可能提出您自己的问题。
  • @ManishDoni 您似乎不了解 StackOverflow 站点。作者是提出问题的人。其他人应该回答问题或提供有用或相关的 cmets,或者提出可能阐明问题并导致答案的问题。你的也不是。这实际上是另一个问题,可以按照我指出的方式回答。向自己可能不理解的人提出问题也是不合逻辑的,这可能就是 he 提出 his 问题的原因。

标签: java string reference garbage-collection


【解决方案1】:

sr 不会被垃圾回收,因为 String 在内部缓存了字符串。因此内部缓存仍然有一个引用,因此 WeakRefence 不会被垃圾回收。

像 sr 的情况下静态构造的 String 被添加到缓存中。使用 new Stirng("...") 构造的字符串对象不是。因此,通常最好不要使用 new String("...")。

【讨论】:

  • 没有。 sr 没有被垃圾收集,因为编译器将文字字符串放置在常量池中。 String 类的缓存与此无关。
【解决方案2】:

在第一种情况下,当您使用new String("I'm here")创建字符串对象时,总是在堆上创建对象。因此,如果您调用System.gc();,那么该对象可以直接用于垃圾回收。

而在第二种情况下,您将字符串作为对象的引用传递。所以这里它不会创建字符串的新对象,因为字符串直接初始化为对象的引用。所以它不能用于垃圾收集。因为这个字符串将留在string-pool

【讨论】:

    【解决方案3】:

    字符串池中的对象不会被垃圾回收,因为它们不驻留在堆中。如果你想在池中放置一个new String(),你可以选择使用String#intern()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-04
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      相关资源
      最近更新 更多