JAVA常见垃圾回收器介绍

1、垃圾定义

 

2、如何确定垃圾

2.1 引用计数法

在 Java 中,引用和对象是有关联的。如果要操作对象则必须用引用进行。因此,很显然一个简单
的办法是通过引用计数来判断一个对象是否可以回收。简单说,即一个对象如果没有任何与之关
联的引用,即他们的引用计数都不为 0,则说明对象不太可能再被用到,那么这个对象就是可回收
对象

2.2

为了解决引用计数法的循环引用问题,Java 使用了可达性分析的方法。通过一系列的“GC roots”
对象作为起点搜索。如果在“GC roots”和一个对象之间没有可达路径,则称该对象是不可达的。13/04/2018
Page 27 of 283
要注意的是,不可达对象不等价于可回收对象,不可达对象变为可回收对象至少要经过两次标记
过程。两次标记后仍然是可回收对象,则将面临回收
 
3、垃圾回收算法
标记清除算法(Mark-Sweep)
  找出需要回收的内存,直接清除
  缺点:会产生很多内存碎片,后续可能发生大对象不能找到可利用空间的问题。
复制算法(copying) 
  简介:为了解决 Mark-Sweep 算法内存碎片化的缺陷而被提出的算法。按内存容量将内存划分为等大小
的两块。每次只使用其中一块,当这一块内存满后将尚存活的对象复制到另一块上去,把已使用
的内存清掉
  优缺点:这种算法虽然实现简单,内存效率高,不易产生碎片,但是最大的问题是可用内存被压缩到了原
本的一半。且存活对象增多的话,Copying 算法的效率会大大降低
标记整理算法(Mark-Compact)
  结合了以上两个算法,为了避免缺陷而提出。标记阶段和 Mark-Sweep 算法相同,标记后不是清
理对象,而是将存活对象移向内存的一端。然后清除端边界外的对象
 
4、常见垃圾回收器

 

 Serial:新生代,回收时会停止应用程序线程,且是单线程

Parallel Scavenge:新生代,回收时会停止应用程序线程,但是多线程

ParNew:配合年老代的CMS使用

 Serial Od:年老代,回收时会停止应用程序线程,且是单线程

 Parallel Old:年老代,回收时会停止应用程序线程,但是多线程

CMS(Concurrent mark sweep():年老代,不会停止用户线程

  其最主要目标是获取最短垃圾

回收停顿时间,和其他年老代使用标记-整理算法不同,它使用多线程的标记-清除算法。
最短的垃圾收集停顿时间可以为交互比较高的程序提高用户体验
G1(Garbage first ) 
  垃圾收集器是目前垃圾收集器理论发展的最前沿成果,相比与 CMS 收集器,G1 收
  集器两个最突出的改进是:
  1. 基于标记-整理算法,不产生内存碎片。
  2. 可以非常精确控制停顿时间,在不牺牲吞吐量前提下,实现低停顿垃圾回收。
  G1 收集器避免全区域垃圾收集,它把堆内存划分为大小固定的几个独立区域,并且跟踪这些区域
  的垃圾收集进度,同时在后台维护一个优先级列表,每次根据所允许的收集时间,优先回收垃圾
  最多的区域。区域划分和优先级区域回收机制,确保 G1 收集器可以在有限时间获得最高的垃圾收
  集效率。
ZGC

 

 

posted @ 2022-01-14 14:04  吕飞lv  阅读(389)  评论(0)    收藏  举报