gpt4 book ai didi

java - 如何删除字符串池中未引用的值?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:20:31 24 4
gpt4 key购买 nike

我很好奇字符串池中的值是如何被删除的?

假设:

String a = "ABC"; // has a reference of string-pool
String b = new String("ABC"); // has a heap reference

b = null;
a = null;

在 GC 的情况下,堆中的“ABC”被收集,但“ABC”仍在池中(因为它在 permGen 中,GC 不会影响它)。

如果我们继续添加如下值:

String c = "ABC"; // pointing to 'ABC' in the pool. 

for(int i=0; i< 10000; i++) {
c = ""+i;
// each iteration adds a new value in the pool. Previous values don't have a pointer.
}

我想知道的是:

  • 池会删除未引用的值吗?如果不是,则意味着池正在消耗不必要的内存。
  • 那么 JVM 正在使用池有什么意义呢?
  • 什么时候这会成为性能风险?

最佳答案

作为此代码的一部分

String c = "ABC"; // pointing to 'ABC' in pool. 

for(int i=0; i< 10000; i++) {
c = ""+i; // each iteration add new value in pool. and pervious values has no pointer

}

池中只有两个 String 对象,这两个对象来自两个 String 文字,"ABC"“”。从串联创建的每个其他 String 将是具有常规 GC 行为的常规对象,即。当它们不再可达时收集的候选对象。

来自池中 String 文字的 String 值将不会被收集,因为它们总是可访问的(带有类加载器的 YMMV)。 String 驻留但不是来自文字的对象应该以常规方式成为 GC 的候选对象。

更多阅读内容:

关于java - 如何删除字符串池中未引用的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32526286/

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