[讨论] [HotSpot VM] JVM中字符串类型的GC策略是怎样的?

lfl2011 2014-11-07

1. String a = "test1";

2. String b = new String("test2");

3. String c = new String("test3").intern();

 

test1 的String实例是在常量池中, a的引用指向常量池中的test1实例

test2 的String实例是在常量池中一份,在堆中一份, b的引用指向堆中test2实例

test3 的String实例是在常量池中一份,在堆中一份,c的引用指向常量池中test3的实例

---------------

第一种:test1实例是不会被回收的?有软(弱)引用指向test1实例,过来一段时间还是被回收的?

第二种:test2实例在常量池中的和test1实例情况相同,test2实例在堆中的如果没有引用指向它,则是会被回收的?

第三种:调用intern()方法后就test3在常量池中的实例和在堆中的实例建立了联系,即常量池中实例指向堆中的实例,它们之间是软(弱)引用关系,

此时还有软(弱)引用指向常量池中的实例,这种情况如果没有外部引用指向常量池中实例和堆中的实例,过一段时间两个实例还是会被回收的。

 

有的认为上述三种情况字符串常量池中的test1,test2,test3的实例都是不会被回收的?

---------------

 

上述---   ---之间的结论是查看了很多资料解释后的总结,有的各个解释也不一样,感觉有点迷惑。

想把这三种情况的GC策略都搞清楚,希望大大们能详细的解释一下,最好能把hotspot JVM 6,7,8版本之间对String类型的GC差异情况也讲一下。很多的讨论都是在说它们的内存布局及实例化问题,对GC这一块涉及的不多也没有深入,希望ZHH2009 和RednaxelaFX 大大 看到给解释一下,谢谢了!

Global site tag (gtag.js) - Google Analytics