个人博客小站欢迎来访:OuChangNing.cn
Monitor java对象头 Mark Word结构: Monitor:
jvm通过线程逃逸分析发现如果没有线程安全问题会通过即时编译器将该锁消除,提高运行效率。
从jdk 1.7开始已经默认开始逃逸分析,如需关闭,需要指定-XX:-DoEscapeAnalysis
如果没有逃逸(即方法中的对象没有发生逃逸)。
使用逃逸分析编译器可以对代码做如下优化:
- 同步省略。如果一个对象被发现只能从一个线程被访问到,那么对于这个对象的 *** 作可以不考虑同步。
- 将堆分配转化为栈分配。如果一个对象在子程序中被分配,要使指向该对象的指针永远不会逃逸,对象可能是栈分配的候选,而不是堆分配。
- 分离对象或标量替换。有的对象可能不需要作为一个连续的内存结构存在也可以被访问到,那么对象的部分(或全部)可以不存储在内存,而是存储在CPU寄存器中。
- 标量替换:在JIT阶段,如果经过逃逸分析,发现一个对象不会被外界访问的话,那么经过JIT优化,就会把这个对象拆解成若干个其中包含的若干个成员变量来代替。这个过程就是标量替换。
- 栈上分配:如果一个对象并没有逃逸出方法的话,那么就可能被优化成栈上分配。这样就无需在堆上分配内存,也无须进行垃圾回收了(对象生命期跟随着线程的生命期,线程结束后对象自动回收)
代码实现:
get优化(有超时效果)
上一篇:java多线程初始篇
下一篇:共享模型之内存
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)