首页 > 编程语言 >Java-虚拟机-逃逸分析/栈上分配/标量替换

Java-虚拟机-逃逸分析/栈上分配/标量替换

时间:2024-01-08 16:38:20浏览次数:37  
标签:Java 对象 虚拟机 栈上 m1 User new public


假设有下面一个类,本文会一直使用这个类演示

public class User{
	public int id;
	public String name;
}

逃逸分析: 逃逸指的是在方法中创建的对象,逃到方法外,那么逃逸分析,指的就是分析一个在方法内创建的对象,有没有可能从它所在的方法中逃出去,例如下面的代码,就会逃到方法外

public static User u;
public void m1(){
	u=new User();
}

下面的代码,就不会逃出去

public void m1(){
	User u=new User();
}

很明显,上述两段代码,我们人类一眼就能看得懂,但是JVM要想看得懂那就得由sun的工程师自己写来判断了,这套用来判断方法内创建的对象能否逃到方法外的技术(底层代码),就叫逃逸分析

栈上分配: 指的是在栈上分配对象,正常来说我们都知道new一个对象,这个对象是在堆上的,而在某些业务需求下,如果
一个对象占用内存非常小
并且它所在的方法要轮询很多次
并且经过逃逸分析之后确定这个对象不会逃逸
那么此时在栈上分配该对象就是一种较好的选择(JVM需要开启栈上分配参数-server -XX:+DoEscapeAnalysis才会启动该功能),假设我们没有开启栈上分配,那么下面的代码必定很快GC

while(true){
	m1();
}

但是如果开启了栈上分配,那么无论循环多少次,堆的大小都不会增长(只考虑本文)

标量替换: 经过上述描述,已经知道栈上分配用白话文来说,就是在栈上new个对象出来,但需要注意和普通new对象不同的地方,就是普通new对象,方法中会使用该对象的引用,例如下面的代码,如果没开启栈上分配,那么m1全程操作的都是u的引用

public void m1(){
	User u=new User();
	u.name="我爱武汉汉阳的妹子"; // 此处通过u的引用,去堆中找到u,然后更改name
}

但是如果开启栈上分配,那么m1的局部变量表会多出2个位置,这多出的2个位置会给id和name使用,上面的u.name其实是直接赋值到局部变量表,这种情况就叫做标量替换

文章到此结束,其实就是个概念话术,没什么大用,要是让你写JVM,你也能想到这种优化方式,写本文其实主要是为了阐述标量替换(Eliminate Allocations)


标签:Java,对象,虚拟机,栈上,m1,User,new,public
From: https://blog.51cto.com/u_15711993/9146658

相关文章

  • java: 从HBase中读取数据
    一、添加依赖:<dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>2.6.0</version></dependency><dependency>......
  • java: 写入数据到HBase
    一、添加依赖<dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>2.6.0</version></dependency><dependency>......
  • Java 打maven包 可以使用java -jar 运行
    有时候我们想打一个jar包像springboot项目一样运行javajar来运行,但是直接使用maven引入相关的依赖直接打包无法使用。这时需要在pom.xml中添加一个plugin   <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-pl......
  • 前端三剑客——HTML5+CSS3+JavaScript
    核心技术●实战训练营●项目实战(微视频版)  《前端三剑客——HTML5+CSS3+JavaScript》采用“核心技术→实战训练营→企业级项目实践”的结构和“由浅入深,由深到精”的模式进行讲解。  全书科学设置七大阶段由浅入深循序渐进,为解决实际问题而生。第一阶段、第三阶段、第五阶段......
  • java面向对象 + 内存解析
    这篇博客主要是重点讲解一些内存和一些规定的解释,对于定义我不会过多赘述,没有Java基础的话可以去翻看我之前的博客,学习完成之后再进行阅读。面向对象可以说是Java中最重要的一部分了,这次复习我发现有几个点比较重要,这里分享给大家引入:小明今天想要一辆玩具车,他获取这辆玩具车有两......
  • Java static关键字讲解
    Java内存模型的简化视图:堆内存(Heap):存储所有的对象实例以及数组。无论是哪个线程创建的对象,都存储在堆内存中。栈内存(Stack):每个线程运行时都会创建自己的栈,用于存储局部变量(包括方法的参数)和控制方法调用的执行流。局部变量可能包括对堆内存中对象的引用。方法区(MethodArea,在JDK8......
  • JavaScript WebAPI(三)(详解)
    这次介绍一下webAPI中的一些知识:回调函数回调函数是指如果将函数A做为参数传递给函数B时,我们称函数A为回调函数例如://立即执行函数中传递的函数是一个回调函数(function(){console.log("我是回调函数")})();//监听事件中传递的参数是一个回调函数constdiv=document......
  • JavaScript WebApi(二) 详解
    监听事件介绍事件监听是一种用于在特定条件下执行代码的编程技术。在Web开发中,事件监听器可以用于捕获和响应用户与页面交互的各种操作,如点击、滚动、输入等。事件监听的基本原理是,通过在特定元素上注册事件监听器,当事件在该元素上触发时,相应的处理函数会被执行。以下是事件监听的......
  • Java中子类都继承父类的什么?
    1.构造方法构造方法不可以被继承的,为什么呢?应为名称的定义,构造方法是一类名称与类名一致,无返回值和类型修饰的一种。所以如果子类继承父类的构造方法的话,那么就违背了构造方法的规定。2.成员属性成员属性是可以被继承的,我们要知道,当使用实例化子类的时候,使用new关键字创建子类实例......
  • JavaScript WebApi 一(详讲)
    基础知识在前面的部分已经讲过了,大家如果没有学习过JavaScript的可以去看一下1.DOM引入在JavaScript中,DOM(文档对象模型)提供了一种表示和操作HTML文档的方式。在DOM中,文档被表示为一个由节点组成的树形结构。DOM对象则是这些节点的抽象表示,它们可以通过JavaScript来访问和操作。DOM......