首页 > 编程知识 正文

jvm常用垃圾回收器,jvm常用的垃圾收集算法

时间:2023-05-03 15:30:41 阅读:190149 作者:252

Jvm要进行垃圾回收,首先需要判断目标人群是否生存,但如何判断目标人群是否生存呢?

在垃圾回收器回收堆之前,首先要确定哪些对象仍在被引用,或者哪些对象需要在以后被引用,是否处于生存状态,哪些已经“死”,或者无法以任何方式使用判断对象是否存在,主要使用两种算法,即引用计数算法和可达性分析算法。

在判断目标人群是否存活后,Jvm主要通过四种垃圾回收算法进行垃圾回收,主要是标签去除算法、复制算法、标签整理算法和迭代回收算法。 关于以上6个算法,分别在博客中进行解说。

JVM虚拟机有七个垃圾收集器,如图所示。 图中的连接意味着这些垃圾收集器可以协同使用。

1)Serial收集器(采用复制算法收集frdxmy代垃圾)

Serial是串行的意思,按串行执行。 在单线程收集器中,只使用一个线程进行垃圾回收。 当GC线程运行时,所有其他线程将停止运行。

因此,serial collector==frdxmy代的单线程收集器具有标记和清理为单线程、简单高效的优点。 在单个CPU环境中,单线程收集效率最高,因为没有线程之间的交互开销。 因此,这是客户端场景中的默认frdxmy世代收集器。 这是客户端级别的默认GC方法。

2)ParNew收集器(采用复制算法收集frdxmy代垃圾) 

它可能是串行收集器的多线程版本,但请注意。 ParNew在单核环境中不如Serial,只有在多核条件下才有优势。

除了性能原因外,Server场景中的缺省frdxmy代收集器主要是因为只有这个收集器可以与CMS收集器配合使用。

3)Parallel Scavenge收集器(采用复制算法收集frdxmy代垃圾)

追求并联集电极、高吞吐量,高效利用CPU。 在多线程收集器中,其他收集器的目标也是尽可能缩短用户线程在垃圾回收过程中的停止时间,以提高吞吐量,吞吐量通常为99%。

吞吐量=用户程序运行的时间/(执行用户程序的时间垃圾回收的时间(GC线程时间) )

暂停时间越短越适合需要用户交互的程序,响应速度好可以提高用户体验,所以高通适合对交互响应要求不高的场景。 此收集器是server级别默认采用的GC方法。 因为高通可以有效利用CPU时间,尽快完成程序的运算任务。

4)G1收集器(使用复制+标记整理算法收集frdxmy代和老年代垃圾)

G1(Garbage-First缩写)是面向服务端APP的垃圾收集器,在具有大量CPU和内存的场景中具有卓越的性能(其任务是将来替换CMS收集器)。

将G1堆分割为多个相同大小的独立区域(Region ),frdxmy世代和老世代在物理上不再被隔离。

5)CMS收集器(采用标记清除算法收集老年代垃圾)

CMS(concurrentmarksweep )收集器在JVM老一代收集器中占有重要地位,其最大特点是垃圾回收线程几乎与用户线程同时工作,其工作流程主要包括四个步骤

初始标记:只要标记GC Roots可以直接关联的对象,速度就很快,需要姿势(Stop-the-world ) )。

并发标记:运行GC roots跟踪流程。 整个回收过程耗时最长,不需要停止

重新标记:需要(停止-世界)来修改在同时标记期间由于用户程序的持续行为而更改了标记的某些对象的标记记录

同时清除:清理垃圾,无需停机

收集器线程在整个进程中最耗时的并发标记和并发清除进程之间与用户线程一起工作,因此不需要停止。 但是,CMS收集器还存在以下缺点:

吞吐量低

无法处理漂浮垃圾

基于标签清除算法的内存空间碎片问题

6)Serial Old收集器(采用标记整理算法收集老年代垃圾)

与Serial收集器类似,Serial Old收集器只收集旧年代,也是单线程收集器,在客户端场景中是默认的旧年代垃圾收集器

7)Parallel Old 收集器(采用标记整理算法收集老年代垃圾)

并行scavenge收集器的旧版本

对于重视吞吐量的场景,可以采用并行备用并行模具的组合

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。