当前位置: 首页 > 面试题库 >

Java字符串文字的垃圾收集

史旺
2023-03-14
问题内容

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

我需要澄清以下几点:

  1. 如果在编译时将字符串定义为文字字符串[eg:String str = "java"],那么是否会对其进行垃圾回收?
  2. 如果使用实习方法[eg:String str = new String("java").intern()],那么它会被垃圾回收吗?在第1点中,它也将与String文字区别对待。
  3. 有人提到只有在String卸载类时才会对文字进行垃圾回收吗?是否有道理,因为我认为String永远不会卸课。

问题答案:

如果在编译时将字符串定义为文字字符串[eg:String str = "java";],那么是否会对其进行垃圾回收?

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

代码对象可能无法访问,但前提是它们是动态加载的……并且其类加载器已销毁。

如果我使用内部方法[eg:String str = new String("java").intern()],那么它会被垃圾回收吗?

intern调用返回的对象将是与"java"字符串文字相同的对象。("java"文字在类加载时进行了实习。当你随后String在代码片段中实习新构造的对象时,它将查找并返回之前的实习"java"字符串。)

但是,与字符串文字不相同的实习字符串一旦变得不可访问,便可以进行垃圾回收。PermGen的空间是收集所有近期热点的JVM的垃圾。(在Java 8之前……这会完全删除PermGen。)

在第1点中,它也将与字符串文字区别对待。

否…,因为它与字符串文字是同一对象。

确实,一旦你了解了所发生的情况,很明显,字符串文字也不会被特别对待。这只是“可达性”规则的应用…

有人提到只有在String卸载类时才会对文字进行垃圾回收吗?是否有道理,因为我认为String该类永远都不会卸载。

你是对的。这没有道理。消息人士说这是不正确的。(如果你发布一个URL,这将很有帮助,以便我们可以阅读他们自己说的话…)



 类似资料:
  • 在Java中,当一个对象没有实时引用时,它就有资格进行垃圾回收。对于字符串,情况并非如此,因为字符串将进入字符串池,而JVM将保持对象活动以供重用。这意味着字符串一旦创建就永远不会被垃圾收集?

  • 问题内容: 我知道子字符串内部会保留原始字符串的引用。 但是通过显式定义为,sample1和sample2是否可用于垃圾回收? 我记得在某处看到是否将父对象显式设置为所有子值都可用于垃圾回收。这对上述内容有好处吗?我只是好奇这是否是父母子女关系的情景?如果不是,将这项事业或者是可用于垃圾回收? 问题答案: 首先要说的是,垃圾回收不会立即发生。因此,分配任何东西不会/不会 导致 垃圾回收。什么是 可

  • 问题内容: 探索了Java的字符串内部结构之后,我对所谓的“烫发空间”感到困惑。我最初对它的理解是,它包含 字面值 以及此问题中说明的类元数据。 我还阅读了有关该方法的信息,并将其放入字符串池,返回对该方法唯一实例的引用。据我了解,这是与存在于JVM的perm空间中的String字符串相同的字符串池。在我看来,“烫发空间”是不可能修改的(毕竟它是永久的,是吗?)。但是,然后我发现了这个问题,EJP

  • 本文向大家介绍Java垃圾收集,包括了Java垃圾收集的使用技巧和注意事项,需要的朋友参考一下 示例 C ++方法-新增和删除 在像C ++这样的语言中,应用程序负责管理动态分配的内存所使用的内存。当使用new运算符在C ++堆中创建对象时,需要相应地使用delete运算符来处置该对象: 如果程序忘记了delete一个对象而只是“忘记”了该对象,则关联的内存将丢失给应用程序。这种情况的术语是内存泄

  • 我在网站上读到了这个问题:java内存池是如何划分的?我想知道“字符串常量池”属于这些扇区中的哪一个? 还有池中的文字是否曾经被 GC 化? 方法从池中返回文字的基链接。 如果池确实被 GC 处理,那么它不会对字符串池的想法适得其反吗?将再次创建新的文本,使 GC 无效。 (假设池中仅存在一组特定的文本,它们永远不会过时,迟早会再次需要它们)

  • 问题内容: 我正在Wikipedia中阅读有关内容,并看到了这段代码 当它运行时,这就是结果 在gc之前:r =我在这里,静态=我在这里 在gc之后:r = null,static =我在这里 和变量都是引用字符串对象。现在已被垃圾收集了,但是为什么在调用垃圾收集器之后没有进行垃圾收集呢? 我很好奇这是怎么发生的。 问题答案: 这 并不是 因为字符串池 本身 。 真正的原因是该类对表示文字的Str