逃逸分析

逃逸分析

逃逸分析是java虚拟机优化技术,并不是直接优化代码的手段,而是为其他优化措施提供依据的分析技术。

基本原理

分析对象动态作用域。当一个对象在方法中定义后,正常情况下该对象的作用域就在方法内。但是如果该对象作为调用参数传递到其他方法中(在JAVA中传递的是该对象的引用,实际上还是同一个对象,而不是新的对象),这种就是“方法逃逸”;对象还可以赋值给其他线程能够访问的实例变量(同样是引用传递,实际是同一个对象),这种称为“线程逃逸”。

从不逃逸、方法逃逸到线程逃逸,称为对象由低到高的不同逃逸程度。

对象优化

根据对象的动态作用域,能够对该对象实例采取优化。常见的优化方法有以下三种

栈上分配

  • 一般对象是在堆内存进行分配的,通过栈内存中的指针指向堆内存的区域,当对象没有引用的时候,要等垃圾回收器回收的时候,对象才会被回收,而垃圾回收的过程又是一个不简单的过程,复杂又耗时。如果确定一个对象不会逃逸出线程之外,那么让这个对象在栈上分配,在栈帧出栈的时候对象占用的内存可以随之销毁,就节省了垃圾收集的资源耗费。
  • 局限性:栈上分配可以支持方法逃逸,但不能支持线程逃逸(因为堆是所有线程共享的数据区,而Java栈是线程隔离的数据区,其他线程无法访问)

标量替换

  • 若一个数据无法再分解,那么可以称为标量(如java原始数据类型int);反之,如果一个数据还能够继续分解,那么称为聚合量(例如java对象)。
  • 假如逃逸分析能够正面一个对象不会被方法外部访问,并且该对象可以拆散,那么程序真正执行的时候可以不去创建这个对象,而改为直接创建它的各个组成部分(成员变量)来替代。这样可以让对象的成员变量在栈上存储,在对象不使用的时候同样能够节省垃圾收集和资源的耗费。此外,栈上存储的数据,很有可能会被虚拟机分配到高速寄存器中存储,能够大大的加快读写速度。
  • 局限性:不允许对象逃逸出方法。

同步消除

  • 如果确定一个变量不会逃逸出线程,无法被其他线程访问,那么也就无需考虑多线程的同步问题,对该变量实施的同步措施也可以消除
  • 局限性:不允许变量逃逸出线程

参考:《深入理解Java虚拟机》第11章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值