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 大大 看到给解释一下,谢谢了!