`
ykdsg
  • 浏览: 17352 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

JVM逃逸分析

 
阅读更多

逃逸分析英文作Escape Analysis。在计算机语言编译器优化原理中,逃逸分析是指分析指针动态范围的方法,它同编译器优化原理的指针分析和外形分析相关联。

当变量(或者对象)在方法中分配后,其指针有可能被返回或者被全局引用,这样就会被其他过程或者线程所引用,这种现象称作指针(或者引用)的逃逸(Escape)。
在Java中比如下面的方法:
......
static V global_v;
public void a_method(){
V v=b_method();
c_method();
}
public V b_method(){
V v=new V();
return v;
}
public void c_method(){
global_v=new V();
}
其中b_method方法内部生成的V对象的引用被返回给a_method方法内的变量v,c_method方法内生成的V对象被赋给了全局变量global_v。这两种场景都发生了指针(引用)逃逸。
逃逸分析研究对于Java编译器有什么好处?我们知道Java对象总是在堆中分配的,因此Java对象的创建和回收对系统的开销是很大的。Java语言被批评的一个地方,也是认为Java性能慢的一个原因就是Java不支持运行时栈分配对象,缺少像C#里面的值对象或者C++里面的struct结构。还有就是JVM在构造对象的时候有可能发生partial construct,就是说其他的Thread可以看到这个reference,但是对象却没有构造完全。而现代的编译器(JIT)可以使用out of ordering来调度指令,可能就把reference的赋值放在构造函数前边。这篇文章给除了很好的分析:http://www.ibm.com/developerworks/java/library/j-dcl.html。
Java 6中是否应该加入栈分配对象。其中有人主张可以通过JIT进行逃逸分析的方式来解决目前的问题,不用在语言级别进行支持,虚拟机支持栈分配机制,由JIT对代码进行内联优化和逃逸分析。
那么JIT怎么通过逃逸分析进行代码优化呢?分析下面的过程代码:
public void my_method(){
V v=new V();
//use v
......
v=null;
}
在这个方法中创建的局部对象被赋给了v,但是没有返回,没有赋给全局变量等等操作,因此这个对象是没有逃逸的,是可以在运行时栈进行分配和销毁的对象。没有发生逃逸的对象由于生命周期都在一个方法体内,因此它们是可以在运行时栈上分配并销毁。
这样在JIT编译Java伪代码时,如果能分析出这种代码,那么非逃逸对象其创建和回收就可以在栈上进行,从而能大大提高Java的运行性能。
另外为什么要在逃逸分析之前进行内联分析呢?这是因为往往有些对象在被调用过程中创建并返回给调用过程,调用过程使用完该对象就销毁了。这种情况下如果将这些方法进行内联,它们就由两个方法体变成一个方法体了,这种原来通过返回传递的对象就变成了方法内的局部对象,就变成了非逃逸对象了,这样这些对象就可以在同一栈上进行分配了。
据说Java 6的虚拟机已经支持对象的栈分配和逃逸分析机制了,但目前并没有启动。具可靠的消息,Java 7中将启动这一功能。这对Swing来说又是一次大规模提升速度的机会。
除能将堆分配对象变成栈分配对象,逃逸分析还有其他两个优化应用。一是同步消除。我们知道线程同步的代价是相当高的,同步的后果是降低并发性和性能。逃逸分析可以判断出某个对象是否始终只被一个线程访问,如果只被一个线程访问,那么对该对象的同步操作就可以转化成没有同步保护的操作,这样就能大大提高并发程度和性能。
二是矢量替代。逃逸分析方法如果发现对象的内存存储结构不需要连续进行的话,就可以将对象的部分甚至全部都保存在CPU寄存器内,这样能大大提高访问速度。
Java 7将完全支持了栈式分配对象,JIT将支持逃逸分析优化,另外Java 7还将缺省支持OpenGL的加速功能。

JVM中启用逃逸分析DoEscapeAnalysis

安装jdk1.6.0_14,运行java时传递jvm参数-XX:+DoEscapeAnalysis

逃逸分析还能用于以下优化场景,但在JVM中未知使用。

1,标量替换(Scalar Replacement)

2,减小竞争检测范围

3,基于区域的内存分配

分享到:
评论

相关推荐

    浅析JVM逃逸的原理及分析

    逃逸分析是 JVM 中的一种跨函数全局数据流分析算法,能够分析出一个新的对象的引用的使用范围,从而决定是否要将这个对象分配到堆上。 逃逸分析的原理是基于 Java 本身的限制,即对象只能分配到堆中。为了减少临时...

    java中jvm逃逸问题分析

    Java中JVM逃逸问题分析 JVM 逃逸分析(Escape Analysis)是一种可以有效减少 Java 程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法。通过逃逸分析,Java Hotspot 编译器能够分析出一个新的对象的引用的...

    深入JVM系列-逃逸分析、同步省略、栈上分配、标量替换1

    《深入JVM系列:逃逸分析、同步省略、栈上分配与标量替换解析》 逃逸分析(Escape Analysis)是Java虚拟机中的一个重要优化技术,它通过对程序进行跨函数全局的数据流分析,判断一个新创建的对象是否会被外部方法...

    JVM逃逸_分析、利用与防御.pdf

    本文主要围绕JVM逃逸展开,包括其分析、利用和防御策略。 首先,我们要理解Java的流行性和广泛的应用场景。作为一种跨平台的编程语言,Java被用于大型系统、个人电脑以及嵌入式设备。JVM是Java运行的基础,包括...

    Java Magazine MarApr 2018.pdf

    3. JVM逃逸分析:提到了JVM中的逃逸分析技术,这是HotSpot JIT编译器的一个优化手段。逃逸分析能够分析代码中变量的作用域,以启用更为细微的优化技术,如消除不必要的同步,减小锁的作用范围,减少对象分配等。 4....

    一种基于逃逸分析的对象生命期分析方法.pdf

    在Java虚拟机(JVM)中,逃逸分析可以确定对象是否适合分配在栈上,或者是否可以被提前回收。传统逃逸分析技术虽然在一定程度上能确定对象的逃逸情况,但在对象生命周期的精确分析上仍有改进空间。 本文提出了一种...

    JVM图解-JVM指令-JVM原型图.rar

    - 栈帧优化,如逃逸分析,帮助确定对象是否需要在堆上分配。 6. **JVM调优工具**: - JConsole和VisualVM提供可视化的监控和诊断,帮助开发者理解应用程序的运行状况。 - JProfiler和YourKit等商业工具提供更...

    JVM工作原理学习笔记

    代码优化,通过编译优化、逃逸分析等减少不必要的对象创建;线程调度优化,合理设置线程池大小,避免过多线程导致的资源浪费。 此外,JVM还提供了丰富的诊断工具,如JConsole、VisualVM和JProfiler等,帮助开发者...

    2020 宋红康 JVM 08 堆.pptx

    2020 宋红康 JVM 第 08 章 学习记录PPT。本章主要是讲述 堆空间划分、分配和回收。另外包括逃逸分析相关内容

    jvm特性与java特性

    JVM的性能优化还包括对方法内联、逃逸分析等技术的应用。 5. 线程模型:JVM提供了一套标准的线程模型,使得Java程序能够利用多线程来执行并发任务。JVM的线程模型与操作系统的本地线程直接映射,这有助于更好地利用...

    JVM Hotspot实现源码

    6. **编译和优化策略**:Hotspot使用复杂的优化技术,如逃逸分析、标量替换、循环展开等,来提升代码性能。此外,它还有一套动态适应性优化系统,可以根据运行时数据调整优化级别。 深入理解Hotspot源码,有助于...

    JVM虚拟机源码(C++)

    - **优化技术**:了解JIT编译的优化策略,例如逃逸分析、标量替换、循环展开等。 - **错误和异常处理**:JVM如何处理运行时错误和异常,以及如何进行堆栈展开。 通过研究HotSpot源码,开发者可以更好地理解Java程序...

    马士兵jvm调优笔记.docx

    - `-XX:-DoEscapeAnalysis`:禁用逃逸分析。 - `-XX:-EliminateAllocations`:禁用对象分配优化。 - `-XX:-UserTLAB`:禁用线程本地分配缓冲区。 - `-XX:+PrintGC`:打印垃圾收集信息。 以上是基于《马士兵JVM...

    从 0 开始带你成为JVM实战高手【完整版】

    - HotSpot VM的编译优化技术:内联缓存、逃逸分析等。 2. **JNI技术解析** - JNI(Java Native Interface)接口的功能。 - 使用JNI调用本地方法的过程。 - JNI开发中需要注意的问题及最佳实践。 3. **Java模块...

    深入理解Java虚拟机JVM高级特性与最佳实践1

    作者详细分析了JIT的编译流程和优化技术,包括方法内联、逃逸分析以及循环优化等。这些内容帮助开发者理解如何编写能够触发JIT进行有效优化的代码。 性能调优是本书的另一个重点。作者通过实例演示了如何分析GC日志...

    JVM工作原理

    为了提升性能,JVM采用了多种优化技术,如逃逸分析、标量替换、栈上替换、内联等。这些技术能帮助JVM更好地理解和优化代码。 7. **工具支持** JVM提供了丰富的工具,如JConsole、VisualVM、JProfiler等,用于监控...

    深入了解java中的逃逸分析

    逃逸分析是 Java 虚拟机(JVM)的一种优化技术,通过分析对象的作用域和生命周期,来决定是否对对象进行栈上分配、标量替换、锁消除等优化。逃逸分析的原理是,JVM 通过分析对象的引用情况,来决定对象是否逃逸出...

    Java逃逸分析详解及代码示例

    主要介绍了Java逃逸分析详解及代码示例,具有一定参考价值,需要的朋友可以了解下。

    JVM原理一秒懂,不懂算我输.zip

    1. **逃逸分析**:确定对象是否能被外部访问,优化内存分配。 2. **栈上分配**:如果对象没有逃逸,可以在栈上直接分配,避免垃圾收集。 3. **标量替换**:将对象的字段拆分成多个基本类型,直接在栈帧中表示,减少...

    jvm.rar_JAVA虚拟机_jvm

    逃逸分析用于决定对象是否需要在栈上分配,减少垃圾收集的压力。 7. **异常处理**:JVM支持异常处理机制,通过try-catch-finally语句块来捕获和处理运行时错误。 8. **多线程**:JVM原生支持多线程,每个线程有...

Global site tag (gtag.js) - Google Analytics