JVM逃逸分析

转载 2018年04月16日 12:01:38

一、概述

逃逸分析并不是直接的优化手段,而是一个代码分析,通过动态分析对象的作用域,为其它优化手段如栈上分配、标量替换和同步消除等提供依据,发生逃逸行为的情况有两种:方法逃逸和线程逃逸。
1、方法逃逸:当一个对象在方法中定义之后,作为参数传递到其它方法中;
2、线程逃逸:如类变量或实例变量,可能被其它线程访问到;
如果不存在逃逸行为,则可以对该对象进行如下优化:栈上分配、标量替换和同步消除

-XX:+DoEscapeAnalysis开启逃逸分析(jdk1.8默认开启,其它版本未测试)
-XX:-DoEscapeAnalysis 关闭逃逸分析

二、栈上分配

栈上分配就是把方法中的变量和对象分配到栈上,方法执行完后自动销毁,而不需要垃圾回收的介入,从而提高系统性能。

三、标量替换

Java虚拟机中的原始数据类型(int,long等数值类型以及reference类型等)都不能再进一步分解,它们就可以称为标量。相对的,如果一个数据可以继续分解,那它称为聚合量,Java中最典型的聚合量是对象。如果逃逸分析证明一个对象不会被外部访问,并且这个对象是可分解的,那程序真正执行的时候将可能不创建这个对象,而改为直接创建它的若干个被这个方法使用到的成员变量来代替。拆散后的变量便可以被单独分析与优化,可以各自分别在栈帧或寄存器上分配空间,原本的对象就无需整体分配空间了。

-XX:+EliminateAllocations开启标量替换(jdk1.8默认开启,其它版本未测试)
-XX:-EliminateAllocations 关闭标量替换
标量替换基于分析逃逸基础之上,开启标量替换必须开启逃逸分析

四、同步消除

线程同步本身比较耗,如果确定一个对象不会逃逸出线程,无法被其它线程访问到,那该对象的读写就不会存在竞争,对这个变量的同步措施就可以消除掉。单线程中是没有锁竞争。

-XX:+EliminateLocks开启锁消除(jdk1.8默认开启,其它版本未测试)
-XX:-EliminateLocks 关闭锁消除
锁消除基于分析逃逸基础之上,开启锁消除必须开启逃逸分析





深入分析JVM逃逸分析对性能的影响

逃逸分析(Escape Analysis)逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用,称为方法逃逸。甚至还有可能被外部线程访问到,譬如赋值给类变量或可...
  • jijianshuai
  • jijianshuai
  • 2017-06-26 14:53:44
  • 1140

Java之JVM逃逸分析

引言: 逃逸分析(Escape Analysis)是众多JVM技术中的一个使用不多的技术点,本文将通过一个实例来分析其使用场景。概念逃逸分析,是一种可以有效减少Java 程序中同步负载和内存堆分配压力...
  • blueheart20
  • blueheart20
  • 2017-07-26 23:12:24
  • 3641

JVM优化之逃逸分析(Escape Analysis)

在编程语言的编译优化原理中,分析指针动态范围的方法称之为逃逸分析。通俗一点讲,就是当一个对象的指针被多个方法或线程引用时,我们称这个指针发生了逃逸。 而用来分析这种逃逸现象的方法,就称之为逃逸分析。 ...
  • sz_bdqn
  • sz_bdqn
  • 2016-09-01 11:13:05
  • 558

JVM的栈上分配与逃逸分析(Escape Analysis)

引言:栈上分配与逃逸分析是在JVM层面进行java性能优化的一个技巧,本文将深入解读其应用以及原理。...
  • blueheart20
  • blueheart20
  • 2016-07-28 00:16:08
  • 3327

JVM的逃逸技术介绍

程序小英雄 2016-12-26 15:42 在Java中每一个对象都有一定的作用域,理论上,一个对象在一块代码中构造,那么也应该在这块代码中被回收,但是实际上,我们经常会让一个对象存活更长...
  • u011277123
  • u011277123
  • 2016-12-28 14:29:40
  • 347

Java中的逃逸分析和TLAB以及Java对象分配

我们在学习使用Java的过程中,一般认为new出来的对象都是被分配在堆上,但是这个结论不是那么的绝对,通过对Java对象分配的过程分析,可以知道有两个地方会导致Java中new出来的对象并一定分别在所...
  • yangzl2008
  • yangzl2008
  • 2015-01-27 21:24:12
  • 11441

Java_JVM_逃逸分析技术_栈上分配_标量替换

什么是逃逸分析(Escape Analysis)? 在编程语言的编译优化原理中,分析指针动态范围的方法称之为逃逸分析。它跟静态代码分析技术中的指针分析和外形分析类似。 通俗一点讲,当一个对...
  • Scythe666
  • Scythe666
  • 2016-07-15 16:32:49
  • 1607

java虚拟机的逃逸分析

逃逸分析作为其他优化手段提供依据的分析技术,其基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他方法中,称为方法逃逸。甚至还有可能被外部线程...
  • xuqiaobo
  • xuqiaobo
  • 2016-09-14 09:14:40
  • 646

[转]分层编译对逃逸分析的影响

原始链接JIT简介JVM JIT有多种选择:client(C1), server(C2), 和两者相结合(C1+C2)。client编译速度快,但是所使用的优化较为保守,而server编译速度慢一些,...
  • imduan
  • imduan
  • 2016-11-16 20:25:18
  • 414

Java_逃逸分析技术

什么是逃逸分析(Escape Analysis)? 在编程语言的编译优化原理中,分析指针动态范围的方法称之为逃逸分析。它跟静态代码分析技术中的指针分析和外形分析类似。 通俗一点讲,当一个对...
  • Kinger0
  • Kinger0
  • 2015-08-08 12:23:35
  • 3323
收藏助手
不良信息举报
您举报文章:JVM逃逸分析
举报原因:
原因补充:

(最多只允许输入30个字)