一、JDK 8u20 字符串去重
- 优点:节约大量内存
- 缺点:略微多占用cpu运行时间,新生代回收时间略微增加
-XX:+UseStringDEduplication
String s1 = new String("hello");//char[]{'h','e','l','l','o'}
String s1 = new String("hello");//char[]{'h','e','l','l','o'}
-
将所有新分配的字符串放入一个队列
-
当新生代回收时,检查是否有重复的字符串
-
相同的字符串指向同样的字符数组char[]
-
注意 与String.intern()不同
- String.intern()注重的时字符串对象
- 字符串去重更加注重char[]
- JVM内部使用不同的字符串去重
二、JDK 8u40 并发标记类卸载
所有对象在并发标记后,直到哪些类不在被使用,当一个类加载器内所有的类都不再被使用,则卸载他加载的所有类。
-XX:+ClassUnloadingWithConcurrentMark 默认开启
三、JDK 8u60 回收巨型对象
- 一个对象大于region的一半时,被称为巨型对象。
- G1不会对巨型对象进行复制(太大,复制算法好费时间)
- 回收优先考虑。
- G1会跟踪老年代所有的incoming引用,老年代引用为0时的巨型对象就可以在新生代的垃圾回收中被处理。
四、JDK9并发标记起始时间调整
-
并发标记必须在堆空间沾满之前完成,否则触发FULL GC
-
JDK9之前使用-XX:InitiatingHeapOccupancyPercent
-
JDK9 可以去动态调整
- -XX:InitiatingHeapOccupancyPercent设置初始值
- 进行数据采样并动态调整
- 总会添加一个安全的空档空间