【GC2】垃圾回收算法

1. 如何确定垃圾

如何确定JVM内存中的垃圾对象?

1.1 引用计数法(reference count)

Java中,引用和对象是有关联的,如果要操作某个对象则必须使用引用进行。
给对象上增加引用标记,有几个引用指向它,就给他标记几。
因此,如果某个对象的引用计数为0,则说明该对象是垃圾。
但是,无法处理循环引用场景,一堆垃圾对象

1.2 根可达算法(root searching)

哪些对象是Roots对象?

  1. main函数栈帧中的对象 = 根对象
  2. 静态变量指向的对象
    1. .class在load到内存之后,就会马上初始化静态变量,这个静态变量指向的对象 = 根对象
  3. 常量池 - 常量池中的class会用到别的class的对象 = 根对象
  4. JNI - 调用Native的本地方法中用到的对象 = 根对象
    Java中通过定义一系列的 GC Roots 对象作为搜索的起点,如果在 GC Roots 对象和目标对象之间没有可达的路径,则称为不可达。
    当一个对象被这个算法标记两次之后,视为垃圾对象,面临回收。

which instances are roots?
JVM Stack、NativeMethodStack、run-timeConstantPool、StaticReferenceInMethodArea、Clazz
一个程序启动之后,马上需要的对象 = 根对象

2. 垃圾清除算法

标记清除算法(Mark-Sweep)

MarkSweep算法
原理:分为两个阶段:标记、清除

  1. 标记:标记出需要回收的对象;
  2. 清除:回收垃圾对象所占用的内存空间

问题:导致内存碎片化严重,后续可能导致大对象不能找到可利用的空间

复制算法(Copying)

Copying算法
原理:
按内存容量,将内存划分为大小相等的两块,每次只使用其中的一块,当这一块内存满后,将存活的对象复制到另一块上,将这一块内存清掉。

特点:
效率高,不易产生内存碎片

问题:
可用内存被压缩到了原本的一半,且存活对象增多的化,Copying算法的效率会大大降低

标记压缩算法(Mark-Compact)

MarkCompact算法
原理:
结合了Copying和Mark-Sweep算法,分为两个阶段,标记阶段,和移动清理阶段

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值