代码之家  ›  专栏  ›  技术社区  ›  GuruKulki

垃圾收集和字符串

  •  5
  • GuruKulki  · 技术社区  · 15 年前

    我对字符串有些怀疑

    他们是住在堆上还是串池里?

    若它们在堆上,那个么它们将被垃圾收集,若它们不能被任何活动线程访问的话。

    若在字符串池上,那个么它们将如何被删除或移除,因为我们知道垃圾收集只发生在堆上。

    3 回复  |  直到 15 年前
        1
  •  8
  •   codekaizen    15 年前
    String s = new String("abc");
    

    s引用的字符串对象将位于堆上,字符串文本“abc”将位于字符串池中。字符串池中的对象不会被垃圾收集。它们可以在程序的生命周期中重用,以提高性能。

        2
  •  5
  •   finnw    15 年前

    存储 在堆里,但是 intern() 指定的字符串(包括源中的字符串文字)是 参考 从游泳池里 String

    如果它们在源代码中显示为文本,包括常量字符串表达式(例如。 "a" + "b" Class 出现在中,这通常意味着它们将持续进程运行的时间。

    编辑 : 当你打电话的时候 在代码中的字符串上,它也被添加到此池中,但因为它使用弱引用,所以该字符串 可以 如果不再使用,仍将被垃圾收集。

    另见: interned Strings : Java Glossary

    在此HashMap中注册的字符串集合有时称为字符串池。但是,它们是普通对象,与其他对象一样存在于堆中(可能是以一种优化的方式,因为插入的字符串往往寿命较长)。

        3
  •  1
  •   Vishal    15 年前

    一串 进入文本池,在进程运行(或web应用程序保持加载)期间一直保持在那里 芬尼 而且从不收集垃圾。字符串名称2不为“Alex”分配内存,而是从文本池中重用它。

    对于字符串 创建了两个对象,引用name3和name4是可垃圾回收的。

    String name = "Alex";
    String name2 = "Alex";
    
    String name3 = new String("John");
    String name4 = new String("John");