JVM 一张图带你了解内存分配过程 搞懂逃逸分析|标量替换|指针碰撞|空闲列表|TLAB
2023-06-13 09:16:08 时间
B站搜索“乐哥聊编程“有本篇文章配套视频 https://www.bilibili.com/video/BV1pG4y147xW
面试题
在栈上分配对象,使用标量替换的目的是什么?
内存分配过程
逃逸分析
如何确定对象是否在栈上进行分配,当然得通过逃逸分析了。逃逸分析是什么意思呢?我们直接看两段代码 代码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 (本地线程分配缓冲区)
每个线程预先在堆中预先分配一小块内存
相关文章
- 从JVM内存模型来看并发编程中的可见性和有序性
- JVM初探(一):jvm内存结构[通俗易懂]
- java 针对jvm的面试题_24个Jvm面试题总结及答案
- JVM内存与垃圾回收篇第8章堆
- JVM内存与垃圾回收篇第6章本地方法接口
- 2020最全JVM垃圾回收机制面试题整理,阿里面试官最爱问的都在这里了(附答案)
- jvm最全详解-05-JVM调优工具详解及调优实战[通俗易懂]
- JVM-内存结构「建议收藏」
- java代码大全及详解_史上最全JVM大全详解!java程序员细节到极致的一次,魔鬼…
- JVM 学习笔记(4):内存分配与回收策略
- JVM中的新生代和老年代(Eden空间、两个Survior空间)(转)
- JVM堆内存导致的FGC问题排查
- JVM 彻底搞懂几种常见的垃圾回收机制|标记清除|标记复制|标记整理
- jvm系列之内存区域
- JVM内存调优工具篇之java自带工具
- 分布式系统性能调优: 一篇彻底搞定JMC定位JVM性能问题
- JVM垃圾回收器详解:串行回收新生代内存管理垃圾回收的触发机制
- 独特视角解读JVM内存模型
- Java获得jvm占用的内存和系统的可用内存信息详解编程语言
- 列出JVM中所有的线程组和线程详解编程语言
- 获得jvm占用的内存和系统的可用内存信息详解编程语言
- 改变JVM中的参数以提高Eclipse的运行速度详解编程语言
- JVM基础知识详解编程语言
- JVM类加载机制详解编程语言
- java的jvm虚拟机之直接内存的影响问题讲解详解编程语言
- JVM总结篇详解编程语言
- JVM之堆内存(年经代,老年代)详解编程语言
- jvm看java.lang.OutOfMemoryError: PermGen space详解编程语言
- 参数Linux下修改JVM内存参数的方法(linux修改jvm内存)
- Linux下的JVM监控工具使用指南(jvm监控工具linux)
- Efficiently Monitor JVM Memory on Linux with These Simple Tips(linux监控jvm内存)
- Linux查看JVM内存使用情况指南(linux查看jvm内存)
- 如何在Linux下查看JVM运行情况(查看linuxjvm)
- 如何在Linux上查看JVM运行信息(Linux查看jvm)
- 如何在Linux下修改JVM参数配置(linux修改jvm参数)