当前位置: 首页 > 知识库问答 >
问题:

字符串是否已声明但不再引用,是否符合G'ed的条件?

宦瀚
2023-03-14

据我所知,如果在字符串池中找到字符串,intern方法应该从字符串池返回字符串,否则将在字符串池中添加一个新字符串对象,并返回该字符串的引用。

String s = "a";
s = "b";
String str = new String("a").intern();

在这种情况下会发生什么。。。是否存在两种情况

  1. 直到“a”没有被垃圾收集,并且String str=new String(“a”)。实习生() 执行str将引用此“a”

或者“a”永远不符合垃圾收集的条件?


共有3个答案

东方宜
2023-03-14
  1. a由编译器和类加载器放置在常量池中。
  2. 在不存在对它的引用之前,它不能被垃圾收集。
  3. 's'是第一行代码中对a的引用。
  4. 您的第二行代码会产生另一个引用。
  5. 因此,当's'或'str'可达时,"a"不能被垃圾收集。
  6. 因此,你的最后一个问题(2)开始没有意义,因为它的先决条件不可能发生,
范鸿
2023-03-14

Java规范没有正式禁止String常量的垃圾回收机制,当它们包含的类超出范围时,但是任何两个内容相同的String文字必须引用相同的String对象,返回值的String#intern()必须是由具有相同内容的文字所引用的相同对象。

给定的JVM是否真的从运行时常量池中垃圾收集String对象是一个实现细节,但是,给定这些要求的String实例的可访问性规则是,如果任何可访问变量持有对其的引用,或者如果加载了具有该文本的任何类,则常量池中的String是可访问的。

在您的特定场景中,当:

  • 所有对它的引用都被删除(包括sstr的第一个值,它们引用同一个对象,该对象位于常量池中)和
  • 所有具有String常量且内容为"a"的类都将被卸载。
岳志义
2023-03-14

这在不同的JVM中是不同的。例如,

OpenJDK/Hotspot Java 6:字符串文本位于PermGen和AFAIK中,仅在完整GC上清理(而不仅仅是永久空间的主要集合)

OpenJDK/Hotspot Java 7:字符串文本位于堆中,可以随时收集它们,但我怀疑它们是由代码中使用的PermGen持有的。

OpenJDK/Hotspot Java 8:没有PermGen,所以字符串应该更自由地清理,即使由现在将在堆中的类持有。

1)只有一个字符串文字,它不会被GC'ed,直到没有引用它,也可能在cde中,这可能是当ClassLoader卸载时,如果它曾经卸载过。

2) 如果你创建的第一个“a”和第二个“a”和第三个都是不同的字符串,那么它们可能是不同的字符串。

 类似资料:
  • 问题内容: Python是否有所有字符串的池,并且在那里它们(字符串)单例? 更准确地说,在下面的代码中,是在内存中创建一个还是两个字符串? 问题答案: 字符串在Python中是不可变的,因此实现可以决定是否进行内部(这通常与C#相关联,这意味着某些字符串存储在池中)这个字符串。 在您的示例中,您正在动态创建字符串。CPython并不 总是 查看池以检测字符串是否已经存在- 这也没有意义,因为您首

  • 问题内容: 确定字符串是否为函数结果的最佳方法是什么? https://www.php.net/manual/zh/function.serialize 问题答案: 我会说,尝试一下;-) 引用手册: 如果传递的字符串不是不可序列化的,则返回FALSE并发出E_NOTICE。 所以,你必须检查返回值是或不是 (有或,以确保不会有任何问题或或任何等于,我会说)。 只是当心通知:您可能希望/需要使用@

  • 问题内容: 我的字符串中有双引号,因为我会这样做: 我将如何用Java做到这一点? 问题答案: 否。此类功能在Java中不可用。 从Sun 文档: 当在打印语句中遇到转义序列时,编译器将对其进行相应的解释。例如,如果要将引号放在引号内,则必须在内部引号上使用转义序列\“。要打印句子 你会写

  • 问题内容: 但 为什么仅在分配字符串时才获得相同的id()结果? 编辑:我用“字符串”代替“ ASCII字符串”。感谢您的反馈 问题答案: 这与ASCII与非ASCII无关(您的“非ASCII”仍然是ASCII,只是标点符号,而不是字母数字)。CPython作为实现细节,将仅包含“名称字符”的字符串常量进行实习。在这种情况下,“名称字符”与正则表达式转义的含义相同:字母数字加下划线。 注意:这可以

  • 但是 为什么只有在赋值字符串时才能得到相同的id()结果? 编辑:我将“ascii字符串”替换为“字符串”。感谢您的反馈

  • 问题内容: 如何检查是否是那里的? 我想分配给是否有结果,否则。 我当前的代码是: 问题答案: