JVM 一张图带你了解内存分配过程 搞懂逃逸分析|标量替换|指针碰撞|空闲列表|TLAB
创始人
2024-02-02 23:44:11
0

面试题

在栈上分配对象,使用标量替换的目的是什么?

内存分配过程

逃逸分析

如何确定对象是否在栈上进行分配,当然得通过逃逸分析了。
逃逸分析是什么意思呢?我们直接看两段代码
代码1:

public Student get(){Student student = new Student();student.setName("乐哥聊编程");student.setStuNo("乐哥聊编程");student.setAge(23);return student;
}

代码2:

public void save(){Student student = new Student();student.setName("乐哥聊编程");student.setStuNo("乐哥聊编程");student.setAge(23);// 保存到数据
}

比对两段代码,如果jvm开启逃逸分析:
那么代码1在经过逃逸分析之后:student不允许对象在栈上分配
那么代码2在经过逃逸分析之后:student允许对象在栈上分配

为什么会这样呢?
因为虚拟机在分析代码1后,发现student对象生成之后,被返回了,使用范围不止在当前方法,所以如果在栈上分配的话,那么当前方法结束后,对象就会被移除,但是此时对象是返回给当前方法的调用者的,导致拿到的是空的,最终导致程序出现问题。

同样道理,在分析代码2之后,student只在当前方法使用,所以允许在栈上分配

标量替换

当通过逃逸分析之后,如果对象在栈上分配,jvm将会通过标量替换拆解对象。
标量替换 = 将对象拆解成不能再分为止
聚合量 =对象中可以再次被分解的属性

public class Student {private String name;private String stuNo;private Teacher teacher;private int age;
}

Student对象首先拆解成name,stuNo,age
然后继续拆解Teacher对象,同样拆解方式。

内存划分方式

指针碰撞

将内存对半拆分,中间放一个指针,指针左边是已分配内存空间,右边是空闲内存空间。申请内存地址时,指针向右移动

空闲列表

空闲列表记录了哪段内存地址是空闲的,申请内存空间时,从这个空闲列表中的区域获取内存地址。

如果解决内存分配并发问题?

  • CAS

compareAndSwap(a,oldValue,newValue)

  • TLAB (本地线程分配缓冲区)

每个线程预先在堆中预先分配一小块内存

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...