JVM的四种GC算法

2019/12/30      1769 文(wén)章来源:CSDN 作者:小(xiǎo)杰爱吃蛋

程序在运行过程中,会产生大量的内存垃圾(一些没有(yǒu)引用(yòng)指向的内存对象都属于内存垃圾,因為(wèi)这些对象已经无法访问,程序用(yòng)不了它们了,对程序而言它们已经死亡),為(wèi)了确保程序运行时的性能(néng),java虚拟机在程序运行的过程中不断地进行自动的垃圾回收(GC)。关于 JVM GC 算法主要有(yǒu)下面四种:


1、引用(yòng)计数算法(Reference counting

每个对象在创建的时候,就给这个对象绑定一个计数器。每当有(yǒu)一个引用(yòng)指向该对象时,计数器加1;每当有(yǒu)一个指向它的引用(yòng)被删除时,计数器减1。这样,当没有(yǒu)引用(yòng)指向该对象时,该对象死亡,计数器為(wèi)0,这时就应该对这个对象进行垃圾回收操作。


2、标记清除算法(Mark-Sweep

為(wèi)每个对象存储一个标记位,记录对象的状态(活着或是死亡)。

分(fēn)為(wèi)两个阶段,一个是标记阶段,这个阶段内,為(wèi)每个对象更新(xīn)标记位,检查对象是否死亡;第二个阶段是清除阶段,该阶段对死亡的对象进行清除,执行 GC 操作。


3、标记整理(lǐ)算法

标记-整理(lǐ)法是标记-清除法的一个改进版。同样,在标记阶段,该算法也将所有(yǒu)对象标记為(wèi)存活和死亡两种状态;不同的是,在第二个阶段,该算法并没有(yǒu)直接对死亡的对象进行清理(lǐ),而是将所有(yǒu)存活的对象整理(lǐ)一下,放到另一处空间,然后把剩下的所有(yǒu)对象全部清除。这样就达到了标记-整理(lǐ)的目的。


4、复制算法

该算法将内存平均分(fēn)成两部分(fēn),然后每次只使用(yòng)其中的一部分(fēn),当这部分(fēn)内存满的时候,将内存中所有(yǒu)存活的对象复制到另一个内存中,然后将之前的内存清空,只使用(yòng)这部分(fēn)内存,循环下去。

这个算法与标记-整理(lǐ)算法的區(qū)别在于,该算法不是在同一个區(qū)域复制,而是将所有(yǒu)存活的对象复制到另一个區(qū)域内。


5、JVM不同的版本垃圾回收机制不一样,jdk1.71.8新(xīn)版本和老版本區(qū)别

jdk1.7和1.8旧版本Parallel Old,(老年代)

jdk1.7和1.8新(xīn)版本Parallel Scavenge,(新(xīn)生代)


Parallel Old 收集器

Parallel Scavenge收集器的老年代版,使用(yòng)多(duō)線(xiàn)程与标记整理(lǐ)算法。这个收集器在jdk1.6中才开始提供的,直到Parallel Old 收集器出现后,吞吐量优先收集器终于有(yǒu)了比较名副其实的应用(yòng)组合,在注重吞吐量以及CPU资源敏感的场合,都可(kě)以优先考虑Parallel Scavenge Parallel Old收集器


Parallel Scavenge收集器

Parallel Scavenge收集器是一个新(xīn)生代的手机器,使用(yòng)的是复制算法的收集器,而且也是多(duō)線(xiàn)程的收集器。。Parallel Scavenge收集器,目标达到一个可(kě)控制的吞吐量,使用(yòng)-XX:MaxGCPauseMillus参数控制垃圾停顿时间,使用(yòng)-XX:GCTimeRatio参数控制吞吐量。Parallel Scavenge收集器设置-XX:UseAdaptiveSizePolicy参数,虚拟机会根据当前系统的运行情况收集性能(néng)监控信息,动态调整这些参数以提供最合适的停顿时间或者最大吞吐量(GC自使用(yòng)的调节策略)。

自适应调节策略也是Parallel Scavenge收集器和ParNew收集器一个重要的區(qū)别。


6、需要了解

(1)     GC 是什么? 為(wèi)什么要有(yǒu)GC

GC 是垃圾收集的意思,内存处理(lǐ)是程序员人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java 提供的GC 功能(néng)可(kě)以自动监测对象是否超过作用(yòng)域从而达到自动回收内存的目的,Java 语言没有(yǒu)提供释放已分(fēn)配内存的显示操作方法。Java 程序员不用(yòng)担心内存管理(lǐ),因為(wèi)垃圾收集器会自动进行管理(lǐ)。要请求垃圾收集,可(kě)以调用(yòng)下面的方法之一:

System.gc() 或Runtime.getRuntime().gc()


(2)     垃圾回收器的基本原理(lǐ)是什么

对于GC 来说,当程序员创建对象时,GC 就开始监控这个对象的地址、大小(xiǎo)以及使用(yòng)情况。通常,GC 采用(yòng)有(yǒu)向图的方式记录和管理(lǐ)堆(heap)中的所有(yǒu)对象。通过这种方式确定哪些对象是"可(kě)达的",哪些对象是"不可(kě)达的"。当GC 确定一些对象為(wèi)"不可(kě)达"时,GC 就有(yǒu)责任回收这些内存空间。


3、有(yǒu)什么办法主动提醒虚拟机进行垃圾回收器回收垃圾吗

可(kě)以,可(kě)以手动执行System.gc() Runtime.getRuntime().gc(),通知GC 运行,但是Java 语言规范并不保证GC 一定会执行。


4、垃圾回收机制回收的是什么

垃圾回收机制的目标是回收无用(yòng)对象的内存空间(记住:不是对象),这些内存空间是JVM堆内存的内存空间。垃圾回收只回收内存资源,对于那些物(wù)理(lǐ)资源,如数据库连接,Socket,I/O流等资源无能(néng)无能(néng)為(wèi)力,我们要自己关闭回收。