垃圾收集和字符串

Gur*_*lki 5 java

我对弦乐有一些疑问

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

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

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

Zac*_*112 8

String s = new String("abc");
Run Code Online (Sandbox Code Playgroud)

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


fin*_*nnw 5

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

如果它们在源代码中以文字形式出现,包括常量字符串表达式(例如"a" + "b"),那么它们还将从Class出现中被引用,这通常意味着它们将在过程运行期间一直存在。

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

另请参见: interned字符串:Java术语表

引用那篇文章:

在此HashMap中注册的字符串的集合有时称为字符串池。但是,它们是普通的对象,并且与其他对象一样都存在于堆中(由于内部字符串倾向于长期存在,因此可能以优化的方式存在)。