JVM底层架构
- 类装载子系统
- 运行时数据区
- 执行引擎
JVM内存模型
- 栈(jvm栈)
方法 临时变量 - 堆
对象 - 本地方法栈
c++ native方法 - 程序计数器
程序当前运行的位置 - 方法区(元空间)
static变量方法 classloader 全局变量信息
- 栈 本地方法栈 程序计数器线程私有 有多少线程就有多少栈区
- 堆 方法区是全局共享
- 理解程序在内存中的调用过程
GC机制
- GCRoot标准
被栈 本地方法栈 方法区直接引用或间接引用的对象不能被删除 - 标记清理算法
缺点:会产生内存碎片 - 标记整理算法
解决内存碎片问题
缺点:所有对象前移造成的代价太大 - 复制算法
内存一分为二 在一区上标记对象是否被删除 将没有标记的复制到二区
缺点:需要两倍内存 - GC在堆中的划分
年轻代Young区
老年代Old区
- YoungGC 复制算法 8:1:1
Eden 伊甸园
Survive0
Survive1
当E区快满时,打标记,把没有打标记的复制到S0区,然后将E区和S0区全部删除,等下一次E区快满时,将S0区和E区所有对象打标,将没有打标的复制到S1,E+S1 复制到 S0,E+S0 复制到 S1,如此,往复
垃圾收集器ParNew Old区 age >= 6 大对象(占内存很大)
又叫FullGC,快满时FullGC会引起java程序全部的暂停,全力进行垃圾回收,采用标记清理或标记整理算法
垃圾收集器CMS垃圾收集器 分Young Old
CMS 1. 初次标记 GCRoot对象 STW 2. 并发标记 所有的Old对象 3. 重新标记 修正2 STW 4. 并发清理 标记清理
D1G1
Region区域大小在1M~32M 2000个左右
0.5 <= 所占内存 <1 存储到Old区并标记为H超大对象
所占内存 > 1 多个连续的H区存储 H区是O区的一种
Rset Region中有个地方存储Rset 记录其它Region引用当前Region对象
Cset 本次GC需清理的Region集合
Young Old区都采用G1
Young区 E区和Sfrom区Sto区 在一次GC的过程中利用复制算法,将E区和Sfrom区拷贝到Sto区
Old区 也叫MixGC 1. 初次标记GCRoot对象和所在Region STW 2. RootRegion去扫描Old去的所有Region,看这些Region区中的是否有Rset,直接进行引用 3. 并发标记 同CMS作用相同,不过遍历范围只是被标记的 4. 重新标记 同CMS 采用新的算法 SATB 速度更快 STW 5. 复制清理 只选择了垃圾较多的Region进行清理,虽然清理不干净,但效率高 STW