|
|
|
@ -782,6 +782,8 @@ GC Roots 大体可以分为三大类:
|
|
|
|
|
|
|
|
|
|
### 扩展回收算法
|
|
|
|
|
|
|
|
|
|
https://juejin.cn/post/6896035896916148237
|
|
|
|
|
|
|
|
|
|
目前JVM的垃圾回收器都是对几种朴素算法的发扬光大(没有最优的算法,只有最合适的算法):
|
|
|
|
|
|
|
|
|
|
- **复制算法(Copying)**:复制算法是所有算法里面效率最高的,缺点是会造成一定的空间浪费
|
|
|
|
@ -821,8 +823,28 @@ GC Roots 大体可以分为三大类:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### 标记复制(Mark-Coping)
|
|
|
|
|
|
|
|
|
|
标记-复制算法将内存分为两块相同大小的区域(比如新生代的Survivor区),每次在其中一块区域分配元素,当这块区域内存占满时,就会将存活下来的元素复制到另一块内存区域并清空当前内存区域。
|
|
|
|
|
|
|
|
|
|
- 缺点:浪费一半的内存空间
|
|
|
|
|
- 优点:简单高效
|
|
|
|
|
|
|
|
|
|
**JVM在Eden区保存新对象,在GC时,将Eden和Survivor中存活对象复制到Survivor的另一个分区。这是JVM对复制算法的一个优化。只浪费了1/10的内存空间【JVM的Eden区和Survivor区的比例为 8:2】**
|
|
|
|
|
|
|
|
|
|
![标记复制](images/JVM/标记复制.jpg)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### 分代收集(Generational Collection)
|
|
|
|
|
|
|
|
|
|
分代收集就是根据对象的存活周期将内存分为新生代和老年代。
|
|
|
|
|
|
|
|
|
|
- **新生代**对象“朝生夕死”,每次收集都有大量对象(99%)死去,所以可以选择**标记-复制算法**,只需要付出少量对象的复制成本就可以完成每次垃圾收集
|
|
|
|
|
- **老年代**对象生存几率比较高,存活对象比较多,如果选择复制算法需要付出较高的IO成本,而且没用额外的空间可以用于复制,此时选择**标记-清除**或者**标记-整理**就比较合理
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
研究表明大部分对象可以分为两类:
|
|
|
|
|
|
|
|
|
|
- 大部分对象的生命周期都很短
|
|
|
|
|