JVM内存回收机制

如何判断对象是否可以被回收:

引用计数器:

在对象实例化时,为对象添加一个引用计数器,每当有一个新的地方引用它时,计数器值+1;每当有一个引用失效时,计数器值-1。当计数器值为0时,就可以认为该对象已经不再被任何其他对象所引用,可以被回收。但是,这种方式会存在循环引用无法被回收的问题,因此目前的 JVM 都采取了更加普遍的方式——可达性分析。

可达性分析:

从 GC Root 开始向下搜索,能够到达的对象就被称之为可达对象 ; 不能到达的对象就被称之为不可达对象。 因此,在 GC Root 到对象之间没有任何引用链相连,或者说有一个引用链,但是其上的所有引用都已经被清除,这就意味着对象不可达。 在下一次垃圾回收时,会将这些不可达的对象进行回收。

在 Java 中,GC Roots 主要包括以下几种:

  1. 虚拟机栈中引用的对象
  2. 方法区中类静态属性引用的对象
  3. 方法区中常量引用的对象
  4. 本地方法栈中 JNI(Java Native Interface)引用的对象

内存回收机制:

JVM内存回收机制是JVM自动回收内存中已经不再使用的对象,并将这些内存空间释放出来,供后续程序使用。JVM的内存回收机制主要包括以下几个方面:

1:标记-清除算法:

标记-清除算法是最早被使用的垃圾回收算法之一。它的基本思想是先标记所有可以被回收的对象,然后统一清除所有被标记的对象。这种算法简单易实现,但效率比较低,因为需要扫描整个堆,标记和清除过程需要耗费大量时间。

2:复制算法

复制算法是目前被广泛使用的一种垃圾回收算法。它将内存分成两块,每次只使用其中一块,当一块内存用完之后,就将存活的对象复制到另外一块内存中,然后清空该块内存。这种算法的优点是速度快,缺点是需要额外的内存空间。

3:标记-整理算法

标记-整理算法是标记-清除算法的改进版。它的基本思想是先标记所有可回收的对象,然后将这些对象移到内存的一端,紧挨着未被回收的对象,再清除掉端部的内存。这种算法避免了标记-清除算法中的空间碎片问题,提高了内存的利用率。

4:分代收集算法

分代收集算法是目前最常使用的一种垃圾回收算法。它基于一个观察结果:大多数对象的生命周期较短。因此,JVM将内存分成年轻代和老年代两个部分,采用不同的回收算法对这两个区域进行回收。年轻代中的对象被频繁创建和销毁,采用复制算法;老年代中的对象生命周期比较长,采用标记-清除或标记-整理算法。

JVM的内存回收机制可以通过不同的算法来实现。不同的算法有各自的优缺点,实际使用需要根据具体应用场景选择合适的算法以提高程序性能和稳定性。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值