java垃圾回收机制_Java的垃圾回收机制-GC算法和种类

f30812a23a6721dec89ce3f973029767.png

Java的垃圾回收机制-GC算法和种类

在Java中对象都是都JVM帮助管理的,那什么时候对象才会被回收,答案就是对象成为了垃圾对象,就是没有被引用的对象。怎么确定是否被引用呢?有两种方式:

计数法

给每个对象中添加一个引用计数器,每当有地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;计数器为0的对象就是可以回收的对象。

这个方法的优点就是速度很快,效率高,但是这个方法有个循环引用的问题。循环依赖的对象计数没有其他对象引用了,但是计数也不是零,因此不会被回收。

021ea4c6391e5881c4cb55e4cc6de36a.png

计数循环依赖示意图

从根节点失去关联的A、B和C,没有被其他引用但是计数器不为零,下面是简单的代码示意。

9612e47317abb7865b29fc37728bed0c.png

计数法的循环依赖问题

根搜索算法


从gc root 对象开始查找引用,找到后继续查找当前引用的其他引用,如此循环就构成了一个图,没在图中的就是下次要回收的潜在对象。真正决定对象死亡需要2次标记。

GC root对象:

  • 虚拟机栈(栈帧中的本地变量表)中的引用的对象
  • 方法区的类静态属性引用的对象
  • 方法区的常量引用的对象
  • 本地方法栈中JNI的应用对象

GC 回收算法

  • 标记-清除算法(Mark - Sweep):首先标记有reference的对象,没有标记的就是回收对象,需要清除。缺点:效率问题, 空间问题(产生好多不连续的碎片,使用效率低)
  • 复制算法(Copying):把堆内存分成2份,每次gc, 把一块内存的存活的对象复制到另一块,然后清空这一块内存,这个可以利用的空间减少了一半。
48e0e3bbf69e92d376683b9051abfdfa.png

复制算法

  • 标记—整理算法(Mark Compact):把标记存活的对象,放到内存开始的一端,然后清理边界外的对象。
7aaa1e8fbc8cb56240b99d82878b4c08.png

标记整理

  • 分代收集(Generational gc):按对象的存活周期把内存分成几块,young generation, old generation, young generation 中把内存分成较大的Eden空间, 和2个较小的Survivor空间,新生产的对象放到Eden空间,当Eden 满了的时候,GC把存活的对象移动到第一个Survivor,并把Eden清空,第二次GC的时候把第一个Eden,Survivor空间的存活对象移动到第二个Surivivor空间, 并把其他清空,并把从第一个Survivor移动的对象的age加1, 下一次再把第二个Survivor空间的对象移动到第一个Survivor,如此循环,等age 到了一定值就会把对象移动到old generation。大对象直接在old generation中分配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值