2010-02-04 86 views
5

我对字符串有一些疑问垃圾收集和字符串

他们生活在堆或字符串池中吗?

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

如果在字符串池,然后他们将如何删除或删除,因为我们知道垃圾收集只发生在堆上。

回答

8
String s = new String("abc"); 

由s称为字符串对象将在堆和字符串“ABC”将在字符串池。字符串池中的对象不会被垃圾收集。他们在该计划的整个生命周期中都可以重复使用,以提高性能。

+0

如果你指的是_constant pool_它是类定义的一部分,那么你_can_卸载常量池,只要你可以卸载类(通常需要非关联的类加载器和所有引用它的加载类)。比你的典型程序更难,但Tomcat做到了。 – 2012-05-15 15:02:38

4

它们存储在堆所有,但intern()编辑字符串(包括源字符串文字)是String类池引用

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

编辑: 当你调用intern()在代码中的字符串时,它也被添加到该池,但因为它使用弱引用可以仍然被垃圾收集如果不再使用的字符串。

参见:那篇文章 interned Strings : Java Glossary

报价:

在此HashMap注册字符串有时也被称为串池的回收。然而,它们是普通的对象,就像任何其他对象一样生活在堆上(可能是因为interned字符串往往是长期存在的优化方式)。

0

字符串亚历克斯进入文字池,只要进程运行(或Web应用程序保持加载。)通过finnw如告诉,并且永远不会被垃圾收集在那里停留。字符串name2不为“Alex”分配内存,并从文字池中重新使用它。

PS:文字池也在堆上。

对于字符串约翰两个对象创建参考name3和name4是垃圾回收。

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

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