总结Java中的垃圾回收机制(GC)笔记

在Java中,内存分配和垃圾回收都交给了JVM(Java虚拟机)来处理。GC会管理被JVM保存的对象,对垃圾收集机制GC(Garbage Collection)来说,对象被实例化时GC就开始监控这个对象。

Java中标记垃圾的算法主要有两种: 引用计数法和可达性分析算法

  • 1.引用计数法: 就是给对象中添加一个引用计数器,每引用一次,计数器加 1;当引用失效,计数器就减 1;任何时候计数器为 0 的对象就是不可用的,被标识为垃圾GC进行收集。优点:执行效率高,程序受影响小。缺点:无法检测出循环引用,会导致内存泄露。
  • 2.可达性分析算法: 通过一系列的 “GC Roots” 的对象作为起点,从这些节点开始向下搜索,节点所走过的路径称为引用链,当一个对象到 GC Roots没有任何引用链相连的话,则此对象不可用。

Java的四种垃圾回收算法:

  1. 标记清除算法:分两个步骤,第一个步先标记所有需要回收的对象,标记后就进行统一的回收带标记的对象。优点是简单,缺点是效率较低,还有空间问题,标记清除之后会产生大量不连续的内存碎片,当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而造成内存空间浪费。

  2. 复制算法:将可用内存容量划分为大小相等的两块,每次只使用其中一块。当其中一块的内存用完时,就将其内存中存活的对象复制到另一块上面,然后再把已使用过的内存空间一次清理掉。使用该算法,也不用考虑内存碎片等复杂情况,只是该算法会是将内存缩小为原来的一半。

  3. 标记整理算法:标记整理算法与标记清除算法很相似,但最明显的区别是:标记清除算法仅对不存活的对象进行处理,剩余存活对象不做任何处理,造成内存碎片;而标记整理算法不仅对不存活对象进行处理清除,还对剩余的存活对象进行整理,重新整理,因此其不会产生内存碎片。

  4. 分代回收算法:分代收集算法不是一个新的算法,它会在具体的场景自动选择以上三种算法进行垃圾对象回收。分代收集算法是一种比较智能的算法,也是现在jvm使用最多的一种算法。具体的场景选择:
    jdk1.7之前jvm把内存分为三个区域:新生代老年代永久代
    (1)在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法。只需要付出少量存活对象的复制成本就可以完成收集。
    (2)老年代中因为对象存活率高、没有额外空间对它进行分配复制,就必须用标记-清除或标记-整理。
    程序员也可以调用**System.gc()**方法:告诉垃圾收集器建议进行垃圾收集,而进不进行垃圾收集是JVM决定。注意:GC主要是回收堆和方法区的内存,但GC不会立即收集。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值