Chapter7-JVM性能调优入门

  • 大页面支持
    • Linux上的大页面支持
      • 1.-XX:+UseLargePages
      • 2.修改OS的配置(依据Linux发行版和内核不同,其修改也不同)
      • 3.如Linux中大页面配置不正确, HotSpot VM会接受上面选项,但是会报告无法获取大页面,最后回退到OS默认支持的页面大小
      • 4.了解即可, 基本碰不到要配置此参数

  • 偏向锁
    • -XX:+UseBiasedLocking
    • 当只有一个线程锁定该对象,没有锁冲突的情况下,其锁开销接近lock-free
    • 对于存在锁切换的应用,可以关闭它, -XX:-UseBiasedLocking
    • -XX:+AggressiveOpts使用这个参数时, JDK5 HotSpot VM默认开启偏向锁
      • 加快编译(实验性优化or最新的优化: 实验性的优化方法可能导致无法预期的JVM行为,等它经过足够多的证明再使用)
      • There's a JVM option -XX:+AggressiveOpts that supposedly makes your JVM faster. Lots of people turn this on in Eclipse to try to make it faster. But it makes your JVM less correct. Today I found it to be the cause of a longstanding bug in dx.
      • 如果关注应用的稳定性甚于性能, 请不要使用这个参数

  • 逃逸分析(escape analysis)
    • -XX:+DoEscapeAnalysis
    • 评估Java对象可见范围, 尤其是指由某个线程创建的Java对象在另一个线程中可以访问,此时称该对象逃逸了.
    • 如果Java对象不发生逃逸,则可以采取其他方法进行优化,这种优化技术称为逃逸分析
    • JIT编译器可以采取的优化技术有
      • 1.对象展开
      • 2.标量替换
      • 3.栈上分配
        • 线程的栈帧上分配而非堆,由于对象不逃逸,不被其他线程访问,则可以在线程私有的栈帧上分配,减少堆上对象的数目,减轻gc的频率
      • 4.消除同步
        • 如果该对象不逃逸,则当前线程持有该对象锁,其他线程访问不了该对象,则该锁可以由JIT消除
      • 5.消除垃圾收集的读/写屏障
        • 对象不逃逸,该对象只能从线程本地的根节点访问,因此在其他对象中存储其地址时不需要执行读或写屏障
        • 只有在对象可以被另一个线程访问时才需要读/写屏障
        • 读或写屏障

  • 极端示例

你可能感兴趣的:(Chapter7-JVM性能调优入门)