Java虚拟机
堆
- 保存各个对象
- 年轻代,老年代 1:2
- 年轻代:eden:s0:s1 8:1:1
- 默认对象存在eden区
- 每次minor gc运行一次就会让eden对象转移到s1,s0,然后每次运行年龄加1,达到15就会达到老年代
- s1 s0一次性存放不下的大对象也会被存入老年代
栈(线程)
- 存放线程栈帧
- 局部变量,方法的局部变量
- 操作数栈,方法的操作缓存 变量
- 动态链接,将符号引用转为直接引用,保存方法区具体方法的引用
- 方法出口,保存线程运行的出口,知道返回到主方法的哪一行
- 局部变量表,保存指向对象的指针
本地方法栈
- 存放本地方法(底层用c++和c实现的方法)
- 线程需要本地方法时,就会从此分配地址
方法区
- 常量
- 静态变量,如值是对象,保存堆中对象的引用
- 类信息(class,文件信息)
程序计数器
- 每个线程的程序计数器都保存在此
- 保存程序即将运行的内存地址(行号)
字节码引擎
- 修改不同线程的程序计数器加一
- 执行方法区的class
- 执行垃圾回收
垃圾回收算法
可达性分析
- GC roots:线程栈的本地变量,静态变量,本地方法栈变量
- 从gc roots开始遍历,搜索引用的对象,如果引用则称为非垃圾对象,不引用则称为垃圾对象,直接回收
minor gc 收集年轻代垃圾
full gc 收集老年代垃圾
STW(Stop the word)
- 执行垃圾回收时会中止用户线程,意味着所有的线程都会暂停
- 机制原因是让垃圾回收更加简单方便
几乎不发生full gc原理就一直让年轻代一直minor gc 然后不存满就结束