垃圾收集和字符串

时间:2010-02-04 18:30:05

标签: java

我对字符串有疑问

它们是否存在于堆或字符串池中?

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

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

3 个答案:

答案 0 :(得分:8)

String s = new String("abc");

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

答案 1 :(得分:5)

它们都是存储在堆中,但intern() ed字符串(包括源中的字符串文字)是从{{{>引用的引用 1}} class。

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

修改: 当您在代码中的字符串上调用Class时,它也会添加到此池中,但由于它使用弱引用,因此如果不再使用字符串 仍然会进行垃圾回收。

另见: interned Strings : Java Glossary

引用那篇文章:

  

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

答案 2 :(得分:1)

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

PS:文字池也在堆上。

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

String name = "Alex";
String name2 = "Alex";

String name3 = new String("John");
String name4 = new String("John");