• JVM_逃逸分析


    什么是逃逸分析

            逃逸分析的基本行为就是分析对象的动态作用域:当一个对象在方法中被定义后,可能被外部方法引用(例如作为参数传递到其他方法中),称为方法逃逸;甚至还有可能被外部线程访问(例如为类变量或可以在其他线程中访问的实例变量赋值),称为线程逃逸

    对不逃逸的对象进行高效优化

            若能证明一个对象不会逃逸到方法或线程外,即其他方法或线程无法通过任何途径访问该对象,则可以为该对象进行一些高效优化

    栈上分配:

            JVM中,在堆上分配创建对象的内存空间,堆中的对象对于各个线程都是共享和可见的,只要持有对象的引用,就可以访问堆中存储的对象数据。JVM的GC系统可以回收堆中不再被使用的对象,但回收动作无论是筛选可回收对象,还是回收和整理内存都需要耗费时间。若确定一个对象不会逃逸出方法之外,那么让该对象在栈上分配内存会是一个很不错的主意:对象占用的内存空间随栈帧出栈而销毁。通常来说,不会逃逸的局部对象所占比例很大,若能使用栈上分配,则大量的对象就能随着方法的结束而自动销毁,GC系统的压力将会小很多

    同步消除:

            线程同步本身是一个相对耗时的过程,若逃逸分析能够确定一个变量不会逃逸出线程,即无法被其他线程访问,则该变量的读写势必不会存在竞争,也就是说可以消除该变量的同步措施

    标量替换:

            标量(Scalar):无法再拆分的数据。JVM中的原始数据类型(int等数值类型及reference类型等)都无法进一步拆分,可称为标量。相对的,若数据可拆分,则称为聚合量(Aggregate),Java中的对象就是最经典的聚合量。若将一个Java对象拆分,根据程序的访问情况,将其使用到的成员变量恢复原始类型来访问就称为标量替换
            若逃逸分析证明一个对象不会被外部访问,并且该对象可以被拆分的话,则程序真正执行时,可直接创建该对象被方法调用的成员标量,以此来代替该对象的创建。将对象拆分后,除了可以让对象的成员变量在栈上(栈上存储的数据,有很大概率会被JVM分配至物理机器的高速寄存器中存储)分配与读写外,还可以为后续的进一步优化创建条件

    补充说明

    逃逸分析在1999年就已被提出,但直到JDK1.6才被实现,且尚不成熟
    基于逃逸分析的优化手段,例如前文提到的"栈上分配",由于HotSpot虚拟机目前的实现方式导致栈上分配实现起来较为复杂,因此在HotSpot中暂未实现该项优化

  • 相关阅读:
    数字化档案管理系统解决方案
    《中华人民共和国消防法》(2021年修订版)解读
    大一作业HTML网页作业 HTML CSS制作二十四节气网页
    本地环境OPC数据读写模拟[Python3+OpenOPC+MatrikonOPCSimulation]
    ATF问题二则:EL3可能没有实现吗?&& aarch32中的S-EL1是什么?
    java毕业设计峨眉山景点介绍及旅游攻略推荐平台Mybatis+系统+数据库+调试部署
    MySQL之DQL
    深度学习实战54-基于ChatGLM2大模型构建智能自助用药问答系统与药物智能管理实战的应用
    计算机视觉基础:【矩阵】矩阵选取子集
    精品基于Uniapp+SSM实现的实验室设备预约管理APP
  • 原文地址:https://blog.csdn.net/Mudrock__/article/details/126374282