JVM系统自学笔记8--JDK版本升级带来的一些JVM优化

一、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设置初始值
    • 进行数据采样并动态调整
    • 总会添加一个安全的空档空间
发布了171 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/QilanAllen/article/details/105638654