博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(九)栈上分配与逃逸分析
阅读量:5970 次
发布时间:2019-06-19

本文共 1502 字,大约阅读时间需要 5 分钟。

一、什么是逃逸?

 逃逸是指在某个方法之内创建的对象,除了在方法体之内被引用之外,还在方法体之外被其它变量引用到;这样带来的后果是在该方法执行完毕之后,该方法中创建的对象将无法被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

你可能感兴趣的文章
Angular和SAP C4C的事件处理队列
查看>>
使用shouldComponentUpdate进行性能优化
查看>>
CSS导航条菜单:带小三角形
查看>>
matplotlib嵌入到pyqt中
查看>>
浅析面向对象开发
查看>>
Hystrix降级逻辑中如何获取触发的异常
查看>>
【跃迁之路】【535天】程序员高效学习方法论探索系列(实验阶段292-2018.07.25)...
查看>>
mac系统下git、mysql、nginx、php的环境搭建
查看>>
JavaScript面向对象编程——Array类型
查看>>
使用阿里云ACM简化你的Spring Cloud微服务环境配置管理
查看>>
【“探探”为例】手把手教你用最少的代码实现各种“机器人”
查看>>
js实现txt/excel文件下载
查看>>
mybatis学习笔记
查看>>
初学微信小程序 TodoList
查看>>
JDK10都发布了,nio你了解多少?
查看>>
Android P FAQ第一弹:非SDK管控特性
查看>>
node+express+mongDB实现简单登录注册
查看>>
spring-MVC源码解读(一)
查看>>
java对象关系映射ROM
查看>>
【419天】跃迁之路——程序员高效学习方法论探索系列(实验阶段176-2018.03.31)...
查看>>