Chapter7-JVM性能调优入门
2017-07-23 本文已影响31人
andersonoy
- 大页面支持
- Linux上的大页面支持
- 1.-XX:+UseLargePages
- 2.修改OS的配置(依据Linux发行版和内核不同,其修改也不同)
- 3.如Linux中大页面配置不正确, HotSpot VM会接受上面选项,但是会报告无法获取大页面,最后回退到OS默认支持的页面大小
- 4.了解即可, 基本碰不到要配置此参数
- Linux上的大页面支持
- 偏向锁
- -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.消除垃圾收集的读/写屏障
- 对象不逃逸,该对象只能从线程本地的根节点访问,因此在其他对象中存储其地址时不需要执行读或写屏障
- 只有在对象可以被另一个线程访问时才需要读/写屏障
- 读或写屏障
- 极端示例