首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何删除字符串池中未引用的值?

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

Stack Overflow用户
提问于 2015-09-11 14:49:24
回答 1查看 2.6K关注 0票数 6

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

假设:

代码语言:javascript
复制
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中不会影响它)。

如果我们继续增加如下的值:

代码语言:javascript
复制
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正在使用池,那么有什么意义呢?
  • 这会是什么时候的表现风险?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-11 15:25:22

作为本代码的一部分

代码语言:javascript
复制
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的候选对象。

阅读更多内容:

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32526286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档