- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我听说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/
我是一名优秀的程序员,十分优秀!