运行时数据区
线程共享
堆
方法区
线程私有
栈(虚拟机栈/本地方法栈)
程序计数器
对象引用算法
- 引用计数算法:维护一个计数器,当对象的引用增加则+1,否则-1。缺点无法对象间相互引用。
- 可达性算法:虚拟机栈中对象、方法区中类静态属性引用对象、方法区中常量引用对象、本地方法栈中引用对象为根对象,其后的引用向后顺延。
垃圾回收
分代理论
- 年轻代:大部分对象都是朝生夕亡的,大概为98%
- 老年代:熬过越久次垃圾收集的对象越难以消亡
垃圾收集/GC
- young gc:年轻代gc,只收集年轻代,G1收集器之前有专门的垃圾收集器。
- old gc:老年代gc,只收集老年代,CMS老年代收集器
- full gc:整个堆和方法区的gc
- mixed gc:年轻代与老年代都回收,仅在G1收集器中存在,因为G1收集器只在逻辑上区分年轻代和老年代,G1收集器会预估本次回收成本来进行选择性回收“回收价值”最高的区域。
垃圾收集器
新生代(主要使用复制清除算法)
Serial
单线程垃圾回收,工作时必须暂停其他用户线程,适合单核cpu
PartNew
多线程垃圾收集器,可与老年代CMS垃圾收集器一起工作。
Parallel Scavenge
类似PartNew
老年代
CMS
基于标记清除算法,但当内存没有连续的空间可以分配给大对象时,会提前触发full gc,此时属于标记-清除-整理算法。
优点:并发收集、低停顿
缺点:内存碎片化、吃cpu资源回收时影响吞吐量、无法回收浮动垃圾(并发清除时产生的垃圾)、需要预留空间给浮动垃圾,默认在达到68%时触发回收。
- 初始标记:只标记gc root引用的对象,stw
- 并发标记:与用户线程一起执行,标记其他对象
- 重新标记:处理在上一个阶段中,由于用户并发线程发生新变更的对象,stw
- 并发清除:与用户线程一起执行,清除判断已死亡的对象
G1收集器
将内存等分为了多个小内存区域
……