gpt4 book ai didi

java - 关于PermGC中的字符串对象池

转载 作者:行者123 更新时间:2023-12-02 08:06:01 25 4
gpt4 key购买 nike

我听说PermGC中存在字符串对象池,当执行字符串实习生时,它首先检查池中是否存在等效的字符串对象,如果不存在,则创建一个并返回对字符串对象的引用池化实例。

但这是我的第一个问题。

我认为该对象是在堆上创建的,尤其是首先在年轻代中。如果它在几次垃圾回收期间幸存下来,它就会转移到老一代。谁能解释一下字符串对象如何进入 Perm GC 中存在的池吗?

第二个问题:

字符串 s = "测试";s =“测试1”;

如果我将“test1”重新分配给引用并继续使用“test1”,是否意味着“test”(在年轻代上创建)将被垃圾收集?

第三个问题:字符串对象池和运行时常量池有什么关系?

谢谢。

最佳答案

是什么让你认为实习的 String 首先进入年轻代? String#intern() 方法是 native 方法。实现将其直接移至永久代中当然是很有可能的。

第二个问题:如果没有其他对该 "test" String 实例的引用,则它有资格进行垃圾回收。如果是实习的话,同样的故事。即使不再有任何 Activity 引用的实习字符串也可以被垃圾收集。不过,在较旧的 JVM 中情况可能并非如此。我猜它可能是特定于实现的。

至于第三个问题,我不知道。我所知道的是源代码中的字符串文字被放入同一个池中。如果您要构造一个与源中的字符串常量相等的字符串,然后将其保留,您将返回用于表示该常量的实例。将此视为已立即被保留的字符串文字。

编辑:只需再次阅读您最初的几句话,我想我明白了造成困惑的原因。当你对一个字符串调用intern()时,并且池中还没有相等的字符串,那么它不会首先构造一个等效的字符串。它只会将您调用的实例移动到池中,而不是返回新的引用。 That's how it's stated in the JavaDoc .

关于java - 关于PermGC中的字符串对象池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8156512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com