Code-Life
Code-Life copied to clipboard
<深入理解Java虚拟机> 摘抄 & 二刷感悟
2020.08.23 留坑
GC
- 哪些垃圾需要回收
- 什么时候回收
- 如何回收
哪些垃圾需要回收
GC算法
- 名词
- 标记清除 (两个缺点 1. 堆中存在大量需要回收的对象时,效率低(so 使用并发); 2. gc完后,内存随便话,所以引申出来了后面两种方法 )
- 标记复制 (两个相同的区域,一边满了以后gc,然后将active的对象放到另一边)
- 标记整理 (老年代需要回收的对象并不多,所以gc完后,进行内存的整理)
具体的GC算法实现
- CMS, G1, ZGC TODO
分代垃圾回收
新生代垃圾回收
-
IBM 有专门研究表明,新生代中的对象
98%
都是朝生夕死,所以就不需要按照复制算法中1:1
的比例来划分内存空间。 -
这里鉴于此,新生代采用了如下的划分策略。 现在把新生代再划分为三部分,一块较大的
Eden
和两块较小的Survivor
区域。 当执行垃圾回收时,将Eden
和Survivor
中还存活着的对象一次性地拷贝到另外一块Survivor
空间上,最后清理掉Eden
和刚才用过的Survivor
的空间。HotSpot 虚拟机默认 Eden 和 Survivor 的大小比例是8∶1,也就是每次新生代中可用内存空间为整个新生代容量的90%
(80%
+10%
),只有10%
的内存是会被 “浪费” 的。 -
这样清理完成后,原来的
Survivor
就空了,并一直保持为空,直到下次Minor GC
时,它再作为存活对象的盛放地。两个Survivor
就这样轮流当做GC
过程中新生代存活对象的中转站。
类加载机制
todo