- 优点 简单
- 缺点 回收对象时,需要暂停用户线程
- 优点
- 缺点
- 会造成内存碎片(如果要存大对象的话,往往需要连续的内存空间,因为内存不连贯了,导致无法存大对象。有可能又会触发一次GC或者Full GC ?)
将内存分为多份,先将对象存到一个内存区域中,如果要进行内存回收时,先把标记不需要清理的对象放到另外一块没有使用的内存中
- 优点 解决了内存碎片的问题
- 缺点 会浪费一份内存,也无法解决极端情况大对象超过分配的内存区域(内存被分为多份,假设总内存是10M,分为2份,那么如果要存一个6M的对象结果如何?)
-
GC ROOT
根节点开始扫描对象(Stop the world
) -
让代码运行到安全点(书上讲解的例子的循环,跳转等指令相对会
耗时
,在这些地方设置安全点;同时,有些线程处于Block
或者Sleep
状态会认为处于安全区域)- 方式
- 轮训 =》 没有虚拟机用这种方式
- 通过汇编指令
test
=》 简单高效
- 方式
-
通过
记忆集
解决对象跨代引用问题(新生代引用老年代、老年代引用新生代
) -
通过
写屏障
处理记忆集
变脏问题(对象被赋值?) =》 通过类似于在AOP
在对象被赋值前执行操作和在执行后执行操作 -
并发可达性分析 =》 引入三色标记
简而言之:通过GC ROOT
首次进行并发标记 ,如果一次顺利就可以进行回收;假如在并发标记过程中用户线程使得GC ROOT
引用链发生改变,那么就将这个改变的点(黑色)改为灰色。