- 浏览: 105806 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (75)
- JVM (22)
- 数据结构 (11)
- java 基础 (16)
- gc (6)
- jmock (1)
- Google (2)
- MapReduce (1)
- Memory (2)
- 算法 (2)
- cglib (1)
- jdk (3)
- 虚拟机 (3)
- 安全 (2)
- 多线程 (1)
- 工作 (1)
- 生活 (1)
- MongoDB (2)
- Hadoop (4)
- HDFS (2)
- cms (2)
- Spring (1)
- 网络协议 (1)
- GitHub (1)
- MYSQL 调优和使用必读(转) (1)
- 分布式 (2)
- Big Data (0)
- 技术Blog (1)
- Hbase (2)
- Zookeeper (1)
- paper (0)
最新评论
-
lzc_java:
Java线程安全兼谈DCL -
select*from爱:
it's nice
IT业薪水大揭秘
转载自 ---- http://kenwublog.com/jvm-optimization-escape-analysis
什么是逃逸分析(Escape Analysis)?
在编程语言的编译优化原理中,分析指针动态范围的方法称之为逃逸分析。
通俗一点讲,就是当一个对象的指针被多个方法或线程引用时,我们称这个指针发生了逃逸。
而用来分析这种逃逸现象的方法,就称之为逃逸分析。
举个例子:
Java代码
class A {
public static B b;
public void globalVariablePointerEscape() { // 给全局变量赋值,发生逃逸
b = new B();
}
public B methodPointerEscape() { // 方法返回值,发生逃逸
return new B();
}
public void instancePassPointerEscape() {
methodPointerEscape().printClassName(this); // 实例引用传递,发生逃逸
}
}
class B {
public void printClassName(A a) {
System.out.println(a.class.getName());
}
}
在这个例子中,一共举了3种常见的指针逃逸场景。分别是 全局变量赋值,方法返回值,实例引用传递。
逃逸分析优化JVM原理
我们知道java对象是在堆里分配的,在调用栈中,只保存了对象的指针。
当对象不再使用后,需要依靠GC来遍历引用树并回收内存,如果对象数量较多,将给GC带来较大压力,也间接影响了应用的性能。减少临时对象在堆内分配的数量,无疑是最有效的优化方法。
接下来,举一个场景来阐述。
假设在方法体内,声明了一个局部变量,且该变量在方法执行生命周期内未发生逃逸(在方法体内,未将引用暴露给外面)。
按照JVM内存分配机制,首先会在堆里创建变量类的实例,然后将返回的对象指针压入调用栈,继续执行。
这是优化前,JVM的处理方式。
逃逸分析优化 – 栈上分配
优化原理:分析找到未逃逸的变量,将变量类的实例化内存直接在栈里分配(无需进入堆),分配完成后,继续在调用栈内执行,最后线程结束,栈空间被回收,局部变量也被回收。
这是优化后的处理方式,对比可以看出,主要区别在栈空间直接作为临时对象的存储介质。从而减少了临时对象在堆内的分配数量。
逃逸分析另一个重要的优化 – 锁省略
如果通过逃逸分析能够判断出指向某个局部变量的多个引用被限制在同一方法体内,并且所有这些引用都不能“逃逸”到这个方法体以外的地方,那么HotSpot会要求JIT执行一项优化动作 – 将局部变量上拥有的锁省略掉。
这就是锁省略(lock elision)。
性能测试
class DoubleSlot {
final int value1;
final int value2;
public DoubleSlot(int value1, int value2) {
this.value1 = value1;
this.value2 = value2;
}
}
static int slotValue(DoubleSlot slot) {
return slot.value1 + slot.value2;
}
static int sum(int[] values) {
int sum = 0;
int length = values.length;
for(int i=1; i<100; i++)
sum(values);
for(int i=0; i<100; i++)
test(values);
}
测试结果是:
$ /usr/jdk/jdk1.6.0_14/bin/java -server EscapeAnalysisTest
time 8889261
$ /usr/jdk/jdk1.6.0_14/bin/java -server -XX:+DoEscapeAnalysis?EscapeAnalysisTest
time 1408140
从结果中,可以看到,启用逃逸分析的运行性能6倍于未启用。
JVM中启用逃逸分析 DoEscapeAnalysis
安装jdk1.6.0_14,运行java时传递jvm参数 -XX:+DoEscapeAnalysis
参考资料:
http://www.cag.csail.mit.edu/~rinard/pointer_and_escape_analysis/
http://developer.amd.com/documentation/Articles/pages/01302008_jvm.aspx
http://en.wikipedia.org/wiki/Escape_analysis
http://en.wikipedia.org/wiki/Java_performance#Escape_analysis_and_lock_coarsening
http://staff.ustc.edu.cn/~yuzhang/papers/cncc07.pdf (一种实现方法,过于学术,不过引言部分写得很不错)
http://java.dzone.com/articles/escape-analysis-java-6-update
http://en.wikipedia.org/wiki/Non-negative_matrix_factorization
转载请注明原文链接:http://kenwublog.com/jvm-optimization-escape-analysis
什么是逃逸分析(Escape Analysis)?
在编程语言的编译优化原理中,分析指针动态范围的方法称之为逃逸分析。
通俗一点讲,就是当一个对象的指针被多个方法或线程引用时,我们称这个指针发生了逃逸。
而用来分析这种逃逸现象的方法,就称之为逃逸分析。
举个例子:
Java代码
class A {
public static B b;
public void globalVariablePointerEscape() { // 给全局变量赋值,发生逃逸
b = new B();
}
public B methodPointerEscape() { // 方法返回值,发生逃逸
return new B();
}
public void instancePassPointerEscape() {
methodPointerEscape().printClassName(this); // 实例引用传递,发生逃逸
}
}
class B {
public void printClassName(A a) {
System.out.println(a.class.getName());
}
}
在这个例子中,一共举了3种常见的指针逃逸场景。分别是 全局变量赋值,方法返回值,实例引用传递。
逃逸分析优化JVM原理
我们知道java对象是在堆里分配的,在调用栈中,只保存了对象的指针。
当对象不再使用后,需要依靠GC来遍历引用树并回收内存,如果对象数量较多,将给GC带来较大压力,也间接影响了应用的性能。减少临时对象在堆内分配的数量,无疑是最有效的优化方法。
接下来,举一个场景来阐述。
假设在方法体内,声明了一个局部变量,且该变量在方法执行生命周期内未发生逃逸(在方法体内,未将引用暴露给外面)。
按照JVM内存分配机制,首先会在堆里创建变量类的实例,然后将返回的对象指针压入调用栈,继续执行。
这是优化前,JVM的处理方式。
逃逸分析优化 – 栈上分配
优化原理:分析找到未逃逸的变量,将变量类的实例化内存直接在栈里分配(无需进入堆),分配完成后,继续在调用栈内执行,最后线程结束,栈空间被回收,局部变量也被回收。
这是优化后的处理方式,对比可以看出,主要区别在栈空间直接作为临时对象的存储介质。从而减少了临时对象在堆内的分配数量。
逃逸分析另一个重要的优化 – 锁省略
如果通过逃逸分析能够判断出指向某个局部变量的多个引用被限制在同一方法体内,并且所有这些引用都不能“逃逸”到这个方法体以外的地方,那么HotSpot会要求JIT执行一项优化动作 – 将局部变量上拥有的锁省略掉。
这就是锁省略(lock elision)。
性能测试
class DoubleSlot {
final int value1;
final int value2;
public DoubleSlot(int value1, int value2) {
this.value1 = value1;
this.value2 = value2;
}
}
static int slotValue(DoubleSlot slot) {
return slot.value1 + slot.value2;
}
static int sum(int[] values) {
int sum = 0;
int length = values.length;
for(int i=1; i<100; i++)
sum(values);
for(int i=0; i<100; i++)
test(values);
}
测试结果是:
$ /usr/jdk/jdk1.6.0_14/bin/java -server EscapeAnalysisTest
time 8889261
$ /usr/jdk/jdk1.6.0_14/bin/java -server -XX:+DoEscapeAnalysis?EscapeAnalysisTest
time 1408140
从结果中,可以看到,启用逃逸分析的运行性能6倍于未启用。
JVM中启用逃逸分析 DoEscapeAnalysis
安装jdk1.6.0_14,运行java时传递jvm参数 -XX:+DoEscapeAnalysis
参考资料:
http://www.cag.csail.mit.edu/~rinard/pointer_and_escape_analysis/
http://developer.amd.com/documentation/Articles/pages/01302008_jvm.aspx
http://en.wikipedia.org/wiki/Escape_analysis
http://en.wikipedia.org/wiki/Java_performance#Escape_analysis_and_lock_coarsening
http://staff.ustc.edu.cn/~yuzhang/papers/cncc07.pdf (一种实现方法,过于学术,不过引言部分写得很不错)
http://java.dzone.com/articles/escape-analysis-java-6-update
http://en.wikipedia.org/wiki/Non-negative_matrix_factorization
转载请注明原文链接:http://kenwublog.com/jvm-optimization-escape-analysis
发表评论
-
JVM优化之压缩普通对象指针(CompressedOops)
2013-05-03 11:01 1222通常64位JVM消耗的内存 ... -
JVM优化之调整大内存分页(LargePage)
2013-05-03 10:58 1149转载自 ---- http://kenwublog ... -
java的内存管理
2012-03-29 16:59 1559转载自 ---- http://yangzhiyong77 ... -
java虚拟机常用命令工具(转载)
2012-01-31 16:40 6645转载自 ---- http://learnworld.itey ... -
虚拟机中的锁优化简介(适应性自旋/锁粗化/锁削除/轻量级锁/偏向锁)
2011-10-10 18:07 2128转载自 ---- http://www.iteye.com/t ... -
Java内存泄露的理解与解决
2011-10-10 16:38 931转载自 ---- http://henryyang.itey ... -
深入Java,初探JVM
2011-08-23 17:23 788转载自 ---- http://lrysir ... -
深入理解JVM
2011-08-22 18:18 862转载自 ---- http://yanle ... -
JVM问题诊断常用命令:jinfo,jmap,jstack
2011-08-18 11:19 1518转载自 ---- http://singleant.iteye ... -
Java HotSpot 性能引擎架构
2011-08-17 17:04 992转载自 ---- http://lifethink ... -
CMS gc实践总结(转载)
2011-08-10 15:09 1035首先感谢阿宝 同学的帮助,我才对这个gc算法的调整有 ... -
jvm优化参数整理
2011-08-10 14:47 1384转载自 ---- http://agapple.ite ... -
GC机制小结
2011-08-10 14:07 684转载自 ---- http://zhangjian ... -
Java内存模型(JMM) 资料整理(转载)
2011-08-10 13:35 946转载自 ---- http://blog.csdn.net/o ... -
ClassLoader解析(转载)
2011-08-05 14:35 924转载自 ---- http://shangjava ... -
java线程安全总结 续(转载)
2011-08-03 16:35 814转载自 ---- http://www.iteye ... -
java线程安全总结(转载)
2011-08-03 16:33 735转载自 ---- http://www.iteye ... -
透过JVM看Exception本质(转载)
2011-08-03 15:11 792转载自 ---- http://icyfenix.iteye. ... -
虚拟机中的锁优化简介 ---- 适应性自旋/锁粗化/锁削除/轻量级锁/偏向锁 (转载)
2011-08-03 15:03 1027转载自 ---- http://icyfenix.iteye. ... -
JVM内存管理:深入垃圾收集器与内存分配策略(转载)
2011-08-03 14:59 783转载自 ---- http://www.iteye.com/t ...
相关推荐
深入JVM系列-逃逸分析、同步省略、栈上分配、标量替换深入JVM系列-逃逸分析、同步省略、栈上分配、标量替换逃逸分析方法逃逸线程逃逸优化同步省略同步省略对性能影
Java助力需要jvm学习及优化与性能瓶颈分析参考
JVM优化及面试热点分析
JVM优化方法
当前,以Hadoop、Spark为代表的大数据处理框架,已经在学术界和工业界被广泛应用于大规模数据的处理和分析.这些大数据处理框架采用分布式架构,使用Java、Scala等面向对象语言编写,在集群节点上以Java虚拟机(JVM)...
jvm参数优化后,tomcat稳定可靠,附件为通过长时间在线测试的配置参数文件
文档中描述java的JVM分析,及OOM问题实例讲解,分析。根据京东项目中的实例进行讲解
淘宝JVM优化实践-长仁.pdf
jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识...
- 了解下我们为什么要学习JVM优化 - 掌握jvm的运行参数以及参数的设置 - 掌握jvm的内存模型(堆内存) - 掌握jamp命令的使用以及通过MAT工具进行分析 - 掌握定位分析内存溢出的方法 - 掌握jstack命令的使用 - 掌握...
Jvm性能优化-JVM内存结构原理分析03
大厂架构师-日均百万订单量的JVM优化与高级GC调优策略实战(5.8G) 〖课程介绍〗: 来自顶尖大厂的架构师级JVM优化与GC调优策略实战课程,是具备有尖端技术的优化课程。在课程内容上几乎不用过多的介绍,单是查阅目录就...
JVM性能优化笔记 ------------------------------------------
1 什么是性能优化\ 2 性能测试与优化\ 3 性能优化JVM篇\ 4 性能优化Tomcat篇\ 5 性能优化mysql篇\
JVM分析工具 JVM分析工具JVM分析工具JVM分析工具JVM分析工具JVM分析工具
JVM优化3(Tomcat参数调优,JVM参数调优,jvm字节码,代码优化),供大家查阅!!!!!!!!!!!!!!
IBM java dump 文件分析工具,分析java堆栈信息
最新全JVM优化及面试热点分析.zip
WebSphere性能优化之二:JVM的运行效率.doc
jvm优化;