专栏名称: java一日一条
主要是讲解编程语言java,并且每天都推送一条关于java编程语言的信息
目录
相关文章推荐
51好读  ›  专栏  ›  java一日一条

JVM优化之逃逸分析及锁消除

java一日一条  · 公众号  · Java  · 2019-08-08 20:10

正文

请到「今天看啥」查看全文


Java的性能测试一般都会用到Java Microbenchmark Harness(JMH)。我们就用JMH来测试一下,当现代的JVM能够确认StringBuffer对象只能被一个线程访问时,它是如何通过消除StringBuffer上的锁来缩小性能上的差距的。

锁消除是一项非常有效的优化,在Java 8中它是默认开启的,不过你也可以通过-XX:-DoEscapeAnalysis这个VM参数来关掉它,这样可以看下优化的效果。开启(默认)了逃逸分析后,StringBuffer和StringBuilder的性能基本上是一样的。(结果报告统计的是每秒执行的操作数。分数越高说明性能越好。)

如上所示,关掉了逃逸分析后,StringBuffer的代码要慢15%左右——而这个差别主要就是由于调用append()方法时的加锁操作导致的。

锁粗化(Lock Coarsening)

HotSpot虚拟机还有一些额外的锁优化的技术,虽然从技术上讲它们并不属于逃逸分析子系统中的一部分,但也是通过分析作用域来提高内部锁的性能。当连续获取同一个对象的锁时,HotSpot虚拟机会去检查多个锁区域是否能合并成一个更大的锁区域。这种聚合被称作锁粗化,它能够减少加锁和解锁的消耗。

当HotSpot JVM发现需要加锁时,它会尝试往前查找同一个对象的解锁操作。如果能匹配上,它会考虑是否要将两个锁区域作合并,并删除一组解锁/加锁操作。

我们来看一个程序,它会连续获取同一个对象的监视器锁:

它的字节码如下,看起来非常的冗长:







请到「今天看啥」查看全文