JVM
运行时数据区域
线程共享区域
堆
新生代
- 区域
- Edan区(伊甸园)
- 新生的对象无忧无虑的生活着,知道人满了迎来了世界末日(Minor GC [轻微的GC] )
- S0 (幸存区)
- S1 (幸存区)
- Edan区(伊甸园)
- 操作
老年代
就是长期存在的对象存放的地方
对象在内存(堆)中的存储布局
- 对象头 (Header)
1.标记字段
2.类型指针 - 实例数据 (Instance data)
- 对齐填充 (Padding)
线程私有区域
程序计数器
- 用来记录程序记录未知,以及下一步要执行的位置,和计算机组成中的程序计数器作用一致
栈(虚拟机栈)
主要服务Java虚拟机的方法
主要研究stack farme的主要结构
- 局部变量表
- 操作数栈
- 动态链接区
- 静态方法/私有方法
- 虚方法/多态方法
- 方法返回地址
本地方法栈
主要服务
native方法
结构大概和虚拟机栈一致
对象分配过程
- 类加载检查
- 分配内存
- 分配内存方法
- 指针碰撞
- 空闲列表
- 创建对象分配内存线程安全解决问题
- CAS方法 :乐观锁,比较然后替换
- TLAB方法 :每个线程都有自己的buffer在eden区,然后进行指针碰撞
- 分配内存方法
- 初始化0值
- 设置对象头
- 执行<init>方法
- 包含的东西
- 属性的赋值
- 静态代码块
- 构造方法
- 包含的东西
问题
- s1什么时候被移入对象
- 为什么s1上次GC后还有对象
- 两个Survivor区域会互换角色(
from和to区域)
- 两个Survivor区域会互换角色(
- 该类对应的 java.lang.Class对象没有被任何地方引用(无法通过反射访问该类)。这时什么意思举个例子
- 动态年龄判定:如果在Survivor空间中,相同年龄的所有对象大小的总和大于Survivor空间的一半,那么年龄大于或等于该年龄的对象就可以直接进入老年代,而无需等到MaxTenuringThreshold。
原文: https://www.yuque.com/duifangzhengzaishuru-rqbua/axyc58/zs8emr29fvl5aq21