首页 > 其他分享 >逃逸分析

逃逸分析

时间:2024-03-02 17:45:21浏览次数:14  
标签:分析 Java 对象 逃逸 public 指针

一 概念

我们都知道,Java 创建的对象都是被分配到堆内存上,但不绝对。

通过对Java对象分配的过程分析,可以知道有两种情况会导致Java中创建出来的对象并一定分配在堆上。分别是Java中的逃逸分析和TLAB(Thread Local Allocation Buffer)线程私有的缓存区。

 

逃逸分析,是一种可以有效减少Java程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法。通过逃逸分析,Java Hotspot编译器能够分析出一个新的对象的引用的使用范围从而决定是否要将这个对象分配到堆上。

在计算机语言编译器优化原理中,逃逸分析是指分析指针动态范围的方法,它同编译器优化原理的指针分析和外形分析相关联。当变量(或者对象)在方法中分配后,其指针有可能被返回或者被全局引用,这样就会被其他过程或者线程所引用,这种现象称作指针(或者引用)的逃逸。通俗点讲,如果一个对象的指针被多个方法或者线程引用时,那么我们就称这个对象的指针发生了逃逸。

Java默认开启了逃逸分析的选项。Java的 HotSpot JIT编译器,能够在方法重载或者动态加载代码的时候对代码进行逃逸分析。

package a.b.c;
/**
 *
 * @title <p>逃逸分析</p>
 */
public class EscapeAnalysis {
  public static B b;
  /**
   * <p>全局变量赋值发生指针逃逸</p>
   */
  public void globalVariablePointerEscape() {
    b = new B();
  }
  /**
   * <p>方法返回引用,发生指针逃逸</p>
   * @return
   */
  public B methodPointerEscape() {
    return new B();
  }
  /**
   * <p>实例引用发生指针逃逸</p>
   */
  public void instancePassPointerEscape() {
    methodPointerEscape().printClassName(this);
  }
  class B {
    public void printClassName(EscapeAnalysis clazz) {
      System.out.println(clazz.getClass().getName());
    }
  }
}

 

二 逃逸分析的意义

逃逸分析研究对于 java 编译器有什么好处呢?我们知道 java 对象总是在堆中被分配的,因此 java对象的创建和回收对系统的开销是很大的。java 语言被批评的一个地方,也是认为 java 性能慢的一个原因就是 java不支持栈上分配对象。JDK6里的 Swing内存和性能消耗的瓶颈就是由于 GC 来遍历引用树并回收内存的,如果对象的数目比较多,将给 GC 带来较大的压力,也间接得影响了性能。减少临时对象在堆内分配的数量,无疑是最有效的优化方法。java 中应用里普遍存在一种场景,一般是在方法体内,声明了一个局部变量,并且该变量在方法执行生命周期内未发生逃逸,按照 JVM内存分配机制,首先会在堆内存上创建类的实例(对象),然后将此对象的引用压入调用栈,继续执行,这是JVM优化前的方式。当然,我们可以采用逃逸分析对 JVM 进行优化。即针对栈的重新分配方式,首先我们需要分析并且找到未逃逸的变量,将该变量类的实例化内存直接在栈里分配,无需进入堆,分配完成之后,继续调用栈内执行,最后线程执行结束,栈空间被回收,局部变量对象也被回收,通过这种方式的优化,与优化前的方案主要区别在于对象的存储介质,优化前是在堆中,而优化后的是在栈中,从而减少了堆中临时对象的分配(较耗时),从而优化性能。

 

使用逃逸分析进行性能优化(-XX:+DoEscapeAnalysis开启逃逸分析)

public void method() {
  Test test = new Test();
  //处理逻辑
  ......
  test = null;
}

这段代码,之所以可以在栈上进行内存分配,是因为没有发生指针逃逸,即是引用没有暴露出这个方法体。

 

 

标签:分析,Java,对象,逃逸,public,指针
From: https://www.cnblogs.com/balfish/p/18048966

相关文章

  • SafeSEH机制分析报告
    SafeSEH机制分析报告SafeSEH概述​ WindowsXPSP2之后提出,在程序调用异常处理函数前,对要调用的异常处理函数进行一系列的有效性校验,当发现异常处理函数不可靠时将终止异常处理函数的调用​ 当开启SafeSEH链接选项时,将异常处理信息存放在IMAGE_LOAD_CONFIG_DIRECTORY的SEHHand......
  • 网狐核心源码阅读分析
    框架结构网狐服务器整体上分为4个部分:中转服务器,房间服务器,大厅服务器,sqlserver数据库。其中大厅服务器主要负责帐号管理器:管理用户选择服务器登录地址,校验用户数据等。必需与中转服务器保持长连接,用于更新获取最新数据。房间服务器:用于加载处理每款子游戏逻辑与公共游戏逻辑(例......
  • 程序自动分析—并查集
    Description在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足。考虑一个约束满足问题的简化版本:假设x1,x2,x3,…代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变量相等/不等的约束条件,请判定是否可以分别为每一个变量赋予恰当的值,使得上述所有约束条件......
  • 高速数据采集卡在宽带实时频谱分析中应用
    简介QT7012+QT7125+是一款支持交流耦合宽带信号输入的高精度高速数据采集卡,它具有12bit分辨率、2通道和5GSPS采样率的指标。板载FPGA具备实时信号处理能力,可以进行大数据量的实时信号处理,配备宽带实时频谱分析功能,频率范围10MHz~8GHz,实时频谱分析带宽500MHz;具备外部参考时钟输入......
  • Python贝叶斯回归分析住房负担能力数据集|附代码数据
    原文链接:http://tecdat.cn/?p=11664最近我们被客户要求撰写关于贝叶斯回归的研究报告,包括一些图形和统计输出。我想研究如何使用pymc3在贝叶斯框架内进行线性回归。根据从数据中学到的知识进行推断 贝叶斯规则是什么? 本质上,我们必须将已经知道的知识与世界上的事实相结合。......
  • 直流信号频谱分析
     事实上,他在计算f(t)=1的傅里叶变换,学过复变函数与积分变换后就知道f(t)的傅里叶变换是2πδ(ω),他是在用双边指数函数的极限推导,实际不用那么麻烦,直接用傅里叶变换的对称性就可以推出来。至于所谓的冲激强度,他是在计算2πδ(ω)对于δ(ω)来说的系数是多少,显然是2π,至于为什么......
  • 云渲染农场完成装修效果图的时间分析
    ​高质量的室内设计效果图对于展示设计方案和吸引客户至关重要,但其渲染过程往往耗时且可能导致项目进度延误。对设计师而言,提升渲染速度是至关重要的,因为这直接关系到他们的工作效率以及客户满意度。室内效果图的渲染时间通常受到图像复杂度、必要的细节水平和期望的渲染质量的影......
  • TSINGSEE青犀AI智能分析网关V4工业园区/厂区/工厂智慧安监方案
    一、背景与需求分析随着科技的不断发展,传统的安全监管方式已经难以满足现代工业园区的安全需求。为了提高工业园区的安全监管水平,智慧安监方案成为了新的选择。针对工业园区化工企业多且安全及环保等方面存在风险高、隐患多、精细化管控复杂的情况,需要建立工业园区的智能化视频监......
  • AI智能分析网关V4智慧环保/智慧垃圾站视频智能分析与监控方案
    一、背景介绍随着城市化进程的加速,垃圾处理问题日益受到人们的关注,传统的垃圾站管理方式已经无法满足现代社会的需求。针对当前垃圾站的监管需求,TSINGSEE青犀可基于旗下视频智能检测AI智能分析网关V4与安防监控视频综合管理系统EasyCVR平台,打造智慧垃圾站视频监控与智能分析方案......
  • 智能分析网关V4安全帽检测/反光衣检测/通用工服检测算法及应用
    TSINGSEE青犀视频智能分析网关V4内置了近40种AI算法模型,支持对接入的视频图像进行人、车、物、行为等实时检测分析,上报识别结果,并能进行语音告警播放。硬件管理平台支持RTSP、GB28181协议、以及厂家私有协议接入,可兼容市面上常见的厂家品牌设备,可兼容IPC、网络音柱等,同时也支持智......