一:标记清除法:
标记清除算法就跟 它名字一样,标记 后清除。首先需要标记需要回收的对象,标记算法可以有引用计数法和可达性分析 算法。在标记完成 之后,对标记的对象进行内存回收。
标记清除算法主要是有两个问题,一个是效率问题,标记和清除过程的效率不高,第二个是空间问题,会存在很多内存碎片,导致大对象无法分配内存。
如图,为标记-清除算法示意图:

jvm垃圾收集算法
二:复制算法
复制算法会将内存划分两个存储空间相等的区域,

年轻代:
所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。年轻代分三个区。一个Eden区,两个 Survivor区(一般而言)。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个 Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor去也满了的时候,从第一个Survivor区复制过来的并且此时还存活的对象,将被复制“年老区(Tenured)”。需要注意,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时存在从Eden复制过来对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor去过来的对象。而且,Survivor区总有一个是空的。同时,根据程序需要,Survivor区是可以配置为多个的(多于两个),这样可以增加对象在年轻代中的存在时间,减少被放到年老代的可能。

年老代:
在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。
持久代:
用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应 用可能动态生成或者调用一些class,例如Hibernate 等,在这种时候需要设置一个比较大的持 久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=进行设置。持久带补充:持久带也称为方法区

三:标记整理算法
标记-整理算法思想同标记-清除算法思想一样,但是在标记过后并不是直接将对象 回收,而是将存活的对象向一端移动,然后直接清除掉端边界的内存,苏纳法示意图如下图所示:
jvm垃圾收集算法
四:分代收集算法
分代收集算法的思想主要是将前面的垃圾收集算法思想综合起来,在新生代中,采用复制算法,在 老年代采用标记-清除或者标记-整理算法。

相关文章:

  • 2021-10-05
  • 2021-07-30
  • 2021-06-27
  • 2022-01-01
猜你喜欢
  • 2021-09-14
  • 2022-01-06
  • 2021-08-17
  • 2021-12-11
  • 2021-07-01
  • 2021-05-25
  • 2021-10-05
相关资源
相似解决方案