特性:
public class Demo_4 { public static void main(String[] args) { String x="ab"; /** * 动态创建放入堆中, new String("a"),new String("b"),new String("ab") */ //["a","b","new String("b")"] String s1=new String("a")+new String("b"); String s2=s1.intern();//将字符串对象尝试放入串池, 如果没有就放入, 有就不放入 System.out.println(s1==x);// false System.out.println(s2==x);// true } }
1.6 中在永久代, 1.8 在堆中
StringTable 会发生垃圾回收
-XX:StringTableSize=1000 调整 -XX:StringTableSize=桶的个数
考虑字符串对象是否入池
如果有大量重复的字符串,可以考虑把字符串接入串池, 来减少内存的占用.
直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分, 也不是<<Java虚拟机规范>>中定义的内存, 而是本机直接内存.
给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器都为0的对象就是不再被使用的,垃圾收集器将回收该对象使用的内存
Java虚拟机并不是通过引用计数算法来判断对象是否存活的