对象的逃逸分析

本文探讨了Java 1.7后逃逸分析如何影响对象内存分配,如何通过`-XX:+DoEscapeAnalysis`开关判断,以及栈上分配和标量替换在提升性能中的作用。通过实战例子,对比开启与关闭逃逸分析对速度的影响。
摘要由CSDN通过智能技术生成

首先要了解java对象内存是一定存在堆上的吗?

在jdk1.7之前,对象的创建都是在堆空间创建的,但在1.7的版本之后,HotSpot中默认开启了逃逸分析,所以对象还可能存在栈上。

1.如何判断是否发生逃逸分析

发生逃逸分析的情况:

也就是该user对象有可能会被外部使用

public User test2(){
	User user=new User();
	user.setId(1);
	user.setName("xiaoming")
	return user;
}

没有发生逃逸分析的情况:

该user对象没有被外部使用

public void test1(){
	User user=new User();
	user.setId(1);
	user.setName("xiaoming")
}

这种没有被外部访问,且如果在堆内存上频繁创建,当方法结束,需要被gc,浪费性能,所以1.7的版本之后,默认开启了逃逸分析,对于这样的对象直接在栈上创建。

2.栈空间不足问题

在栈上分配内存的时候:会把聚合量(引用数据类型)替换为标量(java中的基本数据类型),来减少栈空间的开销。

3.总结

逃逸分析+栈上分配+标量替换

4.实战

前提:-Xmx10M -Xms10M

测试代码:

public class escape {

  private static void alloc() {
    byte[] b = new byte[2];
  }

  public static void main(String[] args) {
    long start = System.currentTimeMillis();

    for (int i = 0; i<10000000; i++) {
      alloc();
    }
    long end = System.currentTimeMillis();
    System.out.println("时间:"+(end - start));
  }
}

情况1:-XX:+DoEscapeAnalysis -XX:+PrintGCDetail 开启逃逸分析
在这里插入图片描述

情况2:-XX:-DoEscapeAnalysis -XX:+PrintGCDetail 关闭逃逸分析
在这里插入图片描述
选项“-XX:+PrintEscapeAnalysis”表示查看逃逸分析的筛选结果

开启逃逸分析速度更快!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值