JVM之JIT技术:逃逸分析,锁消除

Posted 程序猿技术

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM之JIT技术:逃逸分析,锁消除相关的知识,希望对你有一定的参考价值。

点击上方蓝字,记得关注我们!

JVM之JIT技术(三):逃逸分析,锁消除

引言
    逃逸分析和锁消除是常用的JIT技术,锁消除常常用来消除不必要的锁。
0
1

    在上一节中,我们已经分析了JIT的较为简单的技术:内联。这里这一节,我们将会讲解逃逸分析和锁消除。

    JVM通过域分析来确定是否一个对象能够从现在方法或者线程的域逃出出去,这被称为逃逸分析。

    如果一个对象仅仅被一个线程使用,那么在这个对象上面的所能被消除,没有必要的同步不会造成性能损耗。如果对象保持在方法的上下文中,它的堆分配也可以避免。

    在上一篇文章中的内联也能帮助这种优化的效果。如果对象仅仅只能被少数的方法访问,内联也就有可能消除堆分配。

    我们可以看下面的例子,在这个代码中同步对于代码没有丝毫影响,因为锁只能被当前线程锁访问

public void lockElision() {

A a = new A();

synchronized (a) {

// Do something meaningful.

}

}

    JVM能够辨别这些,移除了锁相关的部分,因此它表现的性能和没有锁一样。

    这也适用于更为复杂的例子。遗留的代码库可能使用StringBuffer而不是StringBuilder。在一个典型的场景中,通常不需要前一种方法提供的线程安全,但是由于历史原因,它会留在代码中。

    幸运的是,JVM可以在这种情况下为我们优化锁。

    

public void testMethod() {

StringBuffer sb = new StringBuffer();

for (int i = 0; i < 1000; i++) {

String s = "adding stuff";

sb.append(s);

}

String result = sb.toString();

// Do something with the result.

}

    测量的方法和内联中的方法相似,我只是简单的修改了其中的sb是一个StringBuilder,我得到了几乎相同的性能特征。因此,如果StringBuffer没有转义这个方法,它的性能与StringBuilder一样好。    

    但是,如果我故意将它们更改为遗漏sb引用,那么使用StringBuffer的版本会慢得多,而使用StringBuilder的版本性能和以前一样好。

JVM之JIT技术(三):逃逸分析,锁消除

0
2

    这里我们总结了逃逸分析,举出了锁消除的例子,在一个线程访问的方法中,有锁的代码和无锁的性能一样。当然,锁消除也适用于更加复杂的例子,比如Stringbuilder和StringBuffer。

往期精彩回顾

JVM之JIT技术(三):逃逸分析,锁消除
扫描二维码
JVM之JIT技术(三):逃逸分析,锁消除
关注我们吧
你点的每个赞,我都认真当成了喜欢


以上是关于JVM之JIT技术:逃逸分析,锁消除的主要内容,如果未能解决你的问题,请参考以下文章

深入理解java虚拟机(十四)JVM逃逸分析

深入理解java虚拟机(十四)JVM逃逸分析

深入理解java虚拟机(十四)JVM逃逸分析

JVM优化之循环展开(附有详细的汇编代码)

如果面试官问你 JVM,额外回答逃逸分析技术会让你加分!

JVM逃逸分析