一、什么是逃逸?

逃逸是指在某个方法之内创建的对象,除了在方法体之内被引用之外,还在方法体之外被其它变量引用到;这样带来的后果是在该方法执行完毕之后,该方法中创建的对象将无法被GC回收,由于其被其它变量引用。正常的方法调用中,方法体中创建的对象将在执行完毕之后,将回收其中创建的对象;故由于无法回收,即成为逃逸。

二、栈上分配

分析找到未逃逸的变量,将变量类的实例化内存直接在栈里分配(无需进入堆),分配完成后,继续在调用栈内执行,最后线程结束,栈空间被回收,局部变量对象也被回收。

三、栈上分配与逃逸分析的关系

进行逃逸分析之后,产生的后果是所有的对象都将由栈上分配,而非从JVM内存模型中的堆来分配。

四、逃逸分析/栈上分配的优劣分析

优势表现在以下两个方面:

  • 消除同步。线程同步的代价是相当高的,同步的后果是降低并发性和性能。逃逸分析可以判断出某个对象是否始终只被一个线程访问,如果只被一个线程访问,那么对该对象的同步操作就可以转化成没有同步保护的操作,这样就能大大提高并发程度和性能。
  • 矢量替代。逃逸分析方法如果发现对象的内存存储结构不需要连续进行的话,就可以将对象的部分甚至全部都保存在CPU寄存器内,这样能大大提高访问速度。
      劣势:  栈上分配受限于栈的空间大小,一般自我迭代类的需求以及大的对象空间需求操作,将导致栈的内存溢出;故只适用于一定范围之内的内存范围请求。

五、案例

  5.1  测试代码

    package org.eds.homework.jvm;  public class StackOnTest {  public static void alloc() {  byte[] b = new byte[2];  b[0] = 1;  }  public static void main(String[] args) {  long b = System.currentTimeMillis();  for (int i = 0; i < 100000000; i++) {  alloc();  }  long e = System.currentTimeMillis();  System.out.println(e - b);  }  }  

  5.2  进行逃逸分析的设置

设置jvm参数 :-server -Xmx10m -Xms10m -XX:+DoEscapeAnalysis -XX:+PrintGC 

结果:

  5.3  不进行逃逸分析的设置

jvm参数设置:   -server -Xmx10m -Xms10m -XX:-DoEscapeAnalysis -XX:+PrintGC

结果:

  5.4  总结

  • 在进行逃逸分析的运行结果中,只执行了9次就退出程序了。而未进行逃逸分析的结果是2081次,就是说未进行逃逸分析的代码可以执行更多的调用次数。换句话来讲,就是未进行逃逸分析的堆空间远大于进行逃逸分析后使用的栈空间,堆的空间大于栈,这就是根本原因。
  • 栈上分配可以提升代码性能,降低在多线程情况下的锁使用,但是会受限于其空间的大小。

  

转载于:https://www.cnblogs.com/shyroke/p/8302934.html

(九)栈上分配与逃逸分析相关推荐

  1. 3.内存分配、逃逸分析与栈上分配、直接内存和运行时常量池、基本类型的包装类和常量池、TLAB、可达性分析算法(学习笔记)

    3.JVM内存分配 3.1.内存分配概述 3.2.内存分配–Eden区域 3.3.内存分配–大对象直接进老年代 3.3.1.背景 3.3.2.解析 3.4.内存分配–长期存活的对象进去老年代 3.5. ...

  2. JVM逃逸分析(同步省略、标量替换、栈上分配)

    在Java的编译体系中,一个Java的源代码文件变成计算机可执行的机器指令的过程中,需要经过两段编译,第一段是把.java文件转换成.class文件.第二段编译是把.class转换成机器指令的过程. ...

  3. java标量替换_JAVA逃逸分析、栈上分配、标量替换、同步消除

    一.逃逸分析 逃逸分析是编译语言中的一种优化分析,而不是一种优化的手段.通过对象的作用范围的分析,为其他优化手段提供分析数据从而进行优化. 逃逸分析包括: 全局变量赋值逃逸 方法返回值逃逸 实例引用发 ...

  4. Java虚拟机-逃逸分析(Escape Analysis)和栈上分配

    我们都知道Java中的对象默认都是分配到堆上,在调用栈中,只保存了对象的指针.当对象不再使用后,需要依靠GC来遍历引用树并回收内存.如果堆中对象数量太多,回收对象还有整理内存,都会会带来时间上的消耗, ...

  5. GC分类、TLAB、逃逸分析、栈上分配、同步消除、标量替换

    GC分类 JVM的调优的一个环节,也就是垃圾收集,我们需要尽量的避免垃圾回收,因为在垃圾回收的过程中,容易出现STW(Stop the World)的问题,而 Major GC 和 Full GC出现 ...

  6. JVM 栈分配、逃逸分析与TLAB

    最近在学习JVM,在看到这块地方,做一个简化的日志记录,部分内容抄录. 一般认为new出来的对象都是被分配在堆上,但是这个结论不是那么的绝对,通过对Java对象分配的过程分析,可以知道有两个地方会导致 ...

  7. JVM对象内存分配详细过程(栈上分配->TLAB->老年代->Eden区)

    一个类创建实例的时候,需要经过多个步骤,比如我们调用new的时候经过了哪些流程,本文就来详细分析下 专业术语 逃逸分析算法 逃逸分析其实就是分析java对象的动态作用域, 如果一个对象被定义之后,被外 ...

  8. 对象可以在栈上分配空间吗?_Java面试题之:Java中所有的对象都分配在堆中吗?...

    JVM中的内存划分暂不讨论,单说堆(Heap),堆中一般存放的是new出来的对象.但是,随着JIT(即时编译)编译器的发展与逃逸分析(Escape Analysis)技术逐渐成熟,栈上分配.标量替换优 ...

  9. 栈上分配和TLAB的区别

    栈上分配 JVM中,栈上空间为线程私有,堆上空间为全局共享.所以大部分对象存在于堆上,线程通过栈上的引用指向堆上对象的内存地址.堆上没有任何引用关系的对象会被JVM标记后GC掉. 很多对象不存在逃逸现 ...

最新文章

  1. C语言的设计模式-接口隔离
  2. Java初学者都应该搞懂的六个问题
  3. 变量初始化赋值_java数组的定义及初始化
  4. SAP HR 报表开发
  5. python网格测试_测试d的numpy网格大小调整
  6. java ecj_java - 在Maven构建中使用Eclipse Java Compiler(ecj) - 堆栈内存溢出
  7. m5310模组数据上传至onenet_硬核干货!基于M5310-A的NB-IoT水表通信模块软件业务逻辑分享...
  8. Django创建项目后,项目文件夹下的组成部分
  9. linux树莓派mysql_树莓派4B(二):搭建LNMP(LINUX+NIGIX+MYSQL+PHP)+ Pi Dashboard
  10. java web.xml 监听器_【JAVA 核心技术】java web 中的监听器
  11. 解决JupyterLab/JupyterNotebook安装pycherts后依旧报错报错 ModuleNotFoundError: No module named ‘pyecharts‘
  12. Log4j配置学习文档之三 参考
  13. 诺基亚的「翻身」之战
  14. mysql 存储过程的使用;
  15. 三菱FX1N与东元Teco N310变频器通讯实战程序
  16. 机器学习——鸢尾花数据集
  17. html打开显示不全,打开浏览器网页显示不全 网页显示不正常解决方法
  18. BSD协议和FreeBSD
  19. JN5169 ZigBee 3.0 协议栈之 ZigBee 网络参数
  20. 取值范围的计算 以及为何16位int类型范围是- 32768 ~ 32767 8位类型取值范围为什么是-128~127

热门文章

  1. CSS属性选择器和部分伪类
  2. qt实现-给SQLITE添加自定义函数
  3. 利用rank() 和 dense_rank() 来实现分类排名
  4. 设计模式笔记之 - State
  5. flutter设置文本最大宽度
  6. Xamarin Android组件篇教程RecylerView动画组件RecylerViewAnimators(1)
  7. 磁盘修复工具TestDisk
  8. CAB归档文件提取工具cabextract
  9. Xamarin.Forms教程开发Xamarin.Forms应用程序需要的工具
  10. dSploitzANTI渗透教程之HTTP服务重定向地址