首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >字符串文字的垃圾收集

字符串文字的垃圾收集
EN

Stack Overflow用户
提问于 2013-03-10 15:50:27
回答 4查看 14.1K关注 0票数 21

我正在阅读有关垃圾收集的内容,当我搜索字符串文字垃圾收集时,我会得到令人困惑的搜索结果。

我需要澄清以下几点:

  1. 如果一个字符串在编译时(例如:String str = "java" )被定义为文字,那么它会被垃圾收集吗?
  2. 如果使用intern (例如:String str = new String("java").intern() ),那么它会被垃圾收集吗?此外,在第1点中,它是否与字符串文本有不同的处理方式。
  3. 有些地方提到,只有在卸载String类时才会垃圾收集文字?这是否有意义,因为我认为String类永远不会被卸载。
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-10 16:15:37

如果一个字符串在编译时(例如:String str = "java"; )被定义为文字,那么它会被垃圾收集吗?

可能不会。代码对象将包含对表示文本的String对象的一个或多个引用。因此,只要代码对象是可访问的,String对象就会到达。

代码对象可能变得不可访问,但前提是它们是动态加载的.他们的类装载机也被毁了。

如果我使用实习生方法,例如:String str = new String("java").intern(),那么它会被垃圾收集吗?

intern调用返回的对象将是表示"java"字符串文本的相同对象。( "java"文本在类加载时被嵌入。然后,当您在代码片段中实习生新构造的String对象时,它将查找并返回以前被嵌入的"java"字符串。)

但是,与字符串文本不相同的内部字符串一旦变得不可访问,就会被垃圾收集。PermGen空间是在所有最近的HotSpot JVM上收集的垃圾。(在Java 8之前.这完全降低了PermGen。)

此外,在第1点中,它是否与字符串文本有不同的处理方式。

不..。因为它是与字符串文本相同的对象。

事实上,一旦您了解了正在发生的事情,很明显,字符串文本也没有得到特别的处理。这只是“可达性”规则的一个应用.

有些地方提到,只有在卸载String类时才会垃圾收集文字?这是否有意义,因为我认为String类永远不会被卸载。

你是正确的。这没有意义。说这是不正确的消息来源。(如果你发布了一个URL,这样我们就能读到他们为自己说的话,这将是有帮助的。)

票数 19
EN

Stack Overflow用户

发布于 2013-03-10 15:57:57

在正常情况下,字符串文本和类都分配到JVM的永久生成("PermGen")中,并且通常不会被收集。内部的字符串(例如mystring.intern())存储在permgen中String类拥有的内存池中,而且曾经发生过这样的情况,即侵略性的实习生可能会导致空间泄漏,因为字符串池本身包含对每个字符串的引用,即使不存在其他引用。显然,这不再是正确的,至少在JDK1.6中是这样的(例如,请参见here)。

有关permgen的更多信息,this是该主题的一个不错的概述。(注意:该链接指向与产品相关的博客。我与博客、公司或产品没有任何关联,但博客条目很有用,与产品没有多大关系。)

票数 10
EN

Stack Overflow用户

发布于 2013-03-10 15:58:54

  1. 只要程序在内存中,文字字符串就会保留在内存中。
  2. str将被垃圾收集,但是它创建的文字不会。
  3. 这是完全合理的,因为当程序卸载时,字符串类将被卸载。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15324143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档