垃圾收集和字符串

我对弦乐有一些疑问

他们住在堆或字符串池吗?

如果在Heap上,那么它们将被垃圾收集,如果它们无法被任何活动线程访问。

如果在String池上,那么它们将如何删除或删除,因为我们知道垃圾收集只发生在堆上。

String s = new String("abc"); 

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

它们都存储在堆中,但是intern() ed字符串(包括源中的字符串文字)是从String类中的池引用的

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

编辑 :当您在代码中的字符串上调用intern() ,它也会添加到此池中,但由于它使用弱引用, 因此如果不再使用该字符串仍然可以进行垃圾回收。

另请参见: interned Strings:Java词汇表

从那篇文章引用:

在此HashMap中注册的字符串集合有时称为字符串池。 但是,它们是普通的对象,并且像其他任何一样生活在堆上(可能是以优化的方式,因为实习的字符串往往很长)。

字符串Alex进入文字池,只要进程运行(或者Web应用程序仍然加载)就会保持在那里,如finnw所说 ,并且永远不会被垃圾回收。 String name2不为“Alex”分配内存,并从文字池中重用它。

PS:文字池也在堆上。

对于字符串John,使用引用name3和name4创建两个对象,这些对象是垃圾可收集的。

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