JVM——垃圾收集器


最近在看周志明老师的深入理解JVM,之前对JVM的学习都是一些零碎的博客文章,有的时候看的是挺摸不着头脑的,原因无他,跟书籍比起来,博客的质量参差不齐,而且是别人理解总结的东西,学起来总是知其然而不知所以然。不得不说,这本书看起来让人有一种醍醐灌顶的感觉,这篇文章也算是我学习过程中的一个读书总结。

JVM垃圾收集器

都说Java和C++之间有一堵由内存管理筑起来的高墙,墙外的人想进去,墙内的人想出来,作为一名Java开发人员,在刚刚学习Java的时候就了解到JVM,总以为是高大上够不着的东西,但是总归要学一下。
在这里插入图片描述
在这里插入图片描述

什么是Stop The World

Stop The World指的是在垃圾收集的过程中,必须暂停其他所有的用户工作线程,直到垃圾收集线程工作结束,在这一期间,用户线程处于停顿的状态的,理论上来说,Stop The World时间越短,垃圾收集器越优秀,当前的垃圾收集器还没有办法完全取消掉Stop The World,只能尽可能减少Stop The World的时间

Serial收集器

特点

  • Serial收集器又叫做串行收集器,它所做的事情很简单,在垃圾收集期间,暂停掉所有的用户线程,产生Stop The World
  • 面向新生代,使用复制算法,在老年代使用标记-整理算法

优点

  • 简单而又高效
  • 额外内存消耗较少
  • 没有线程交互,单核处理器下效率高
  • 不会产生内存碎片

缺点

  • 单线程,利用不到多核处理器的优势,堆内存较大时Stop The World时间长

ParNew收集器

特点

ParNew收集器实际上是Serial收集器的多线程版本,相较于Serial收集器,它使用了多条线程进行垃圾回收,其他的都与Serial收集器相同。

优点

  • 除了Serial收集器以外,目前只有它能够与CMS收集器配合工作。常用的是ParNew收集器负责新生代,CMS收集器负责老年代。
  • 多核处理器下,相较于 Serial收集器有更高的效率
  • 不会产生内存碎片

缺点

  • 单核处理器效率不如Serial收集器,因为要进行线程切换嘛

Paraller Scavenge收集器

特点

  • 致力于达到可控制的吞吐量
    吞吐量: 处理器用于处理用户代码的时间和处理器总消耗时间的比值,简单来说,就是在确定的时间内尽可能多地执行用户代码。

三个参数:

  • -XX:MaxGCPauseMillis,一个大于0的毫秒数,虚拟机内存回收花费的最大时间
  • -XX:GCTimeRatio,大于0小于100的整数,垃圾收集时间占总时间的比率
  • -XX:+UseAdaptiveSizePolicy,开启自适应调节策略,不需要不需要人工指定新生代的大小等细节参数

Serial Old收集器

特点

  • 是Serial的老年代版本,单线程,标记整理算法

用途

  • 在JDK以及以前与Parallel Scavenge收集器搭配使用
  • CMS收集器发生失败之后的后备预案

Parallel Old收集器

特点

  • 是Parallel Scavenges收集器的老年代版本
  • 多线程并发收集,标记整理算法

CMS收集器

特点

  • 以获取最短停顿时间为目标
    -用于老年代,标记清除算法,并发收集

四个步骤

初始标记

仅仅标记一下GC Roots能直接关联到的对象,速度很快。需要 stop the world

并发标记

从GC Roots直接关联的对象开始遍历整个对象图的过程,耗时较长但是不需要停顿用户线,可以与用户线程并发执行

重新标记

修整并发标记期间,因为用户线程的继续运行而导致标记产生变动的标记记录,停顿时间比初始标记稍长,需要 stop the world

并发清除

清理删除掉标记阶段判断死亡的对象,不需要移动存活对象,可以与用户线程并发执行

缺点

  • 默认回收线程数(CPU+3)/4,在CPU核心不足四核的环境下,对用户程序影响较大
  • 无法处理浮动垃圾,有可能出现收集失败导致一次完全 stop the world的Full GC,造成长时间停顿
    浮动垃圾:在并发标记和并发清除阶段,由于用户程序继续执行而产生的新的垃圾对象,只能等待下一回收时再处理
  • 垃圾收集阶段用户程序继续执行,需要预留出一部分内存,无法等老年代满了在挥手,默认在92%时触发。如果收集期间预留的内存无法满足程序重新分配新对,就会出现并发失败(Concurrent Mode Failure),就只能启动后备预案,临时启动Serial Old收集器进行串行收集。
  • 标记-清除算法会产生内存碎片

Garbage First(G1)收集器

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JVM (Java Virtual Machine) G1 (Garbage-First) 垃圾收集器是一种用于 Java 应用程序的垃圾收集算法。它是自JDK 7u4版本后引入的一种全新的垃圾收集器。 G1垃圾收集器的设计目标是为了解决传统的分代垃圾收集器可能遇到的一些问题,如停顿时间长、内存碎片化等。它采用了一种基于区域的垃圾收集方式,可以将内存划分为多个大小相等的区域,每个区域可以是Eden、Survivor或Old区。 G1垃圾收集器的工作原理如下: 1. 初始标记(Initial Mark):标记所有从根对象直接可达的对象。 2. 并发标记(Concurrent Mark):在并发执行程序的同时,标记那些在初始标记阶段无法访问到的对象。 3. 最终标记(Final Mark):为并发标记阶段中发生改变的对象进行最终标记。 4. 筛选回收(Live Data Counting and Evacuation):根据各个区域的回收价值来优先回收价值低的区域。 G1垃圾收集器具有以下特点: - 并发执行:在执行垃圾收集过程时,尽可能减少应用程序的停顿时间。 - 分区回收:将整个堆划分为多个区域,可以根据需要优先回收垃圾较多的区域,从而避免全堆回收带来的长时间停顿。 - 内存整理:G1垃圾收集器会对内存进行整理,减少内存碎片化,提高内存利用率。 需要注意的是,G1垃圾收集器并不适用于所有情况。在特定的场景下,如大堆情况下的长时间运行、对延迟要求非常高的应用等,可能需要考虑其他垃圾收集器的使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值