学习笔记JVM篇(四)

垃圾回收器

说完垃圾回收算法接下来就需要对应的垃圾回收器去回垃圾回收器。接下来介绍几种垃圾回收器

1、Serial

串行回收器,是单线程版本,暂停所有的应用。在单CPU的情况下效率是很高的,因为不涉及线程的上下文切换。适用于小型程序和客户端应用,不太适合Java Web。Serial使用的垃圾回收算法是,新生代:复制算法;老年代:标记整理

2、ParNew:

作用于新生代的,在Serial的基础上改为了多线程版本,使用多个线程进行垃圾回收。适用于大型应用和Web 程序,在单核CPU的效率比Serial效率低,因为涉及到了线程的上下文切换。

3、Parallel

全称 Parallel Scavenge是一种多线程的收集器,和ParNew收集器类似,是一个新生代的

4、Parallel Old

是Parallel的老年代版本

5、CMS(Concurrent Mark Sweep)

是一种并发的垃圾回收器,用的是标记-清除法。(JDK11之后被废弃了),用于老年代的垃圾回收。停顿时间比较短。过程如下

  1. 初始标记:标记与GCRoot直接关联的的对象(注意是直接关联,间接的不会被标记),此时会触发STW。
  2. 并发标记:与用户线程并发,这里是从与GCRoot直接关联的对象开始扫描,而不是从GCRoot开始。
  3. 重新标记:会触发STW,因为第二步可能会导致一些对象错标或者漏标。
  4. 并发清除:与用户线程并发
6、新一代垃圾回收器G1

全称Garbage First,在不同区域分配垃圾回收。G1垃圾回收器保留了分代思想,但是取消了新生代和老年代的物理划分,把内存分为多个区域(Region),区域中的逻辑包含了新生代和老年代。区域是动态变化的,原先是老年代的区域,在之后可能会变成新生代,实现更精细化的内存划分。

G1整体采用标记整理算法,局部采用标记复制算法,所以不会产生内存碎片。G1垃圾回收器会把内存分为大约2048个区域(Region)。

同时新增了名为Humongous的内存区域用于存储大对象,如果一个H区域装不下则G1会查询连续的H区域去存储该对象,为了找到连续的空间可能会触发Full GC。

G1提供了三种模式的垃圾回收模式:

  1. Young GC:与其它垃圾回收器不同,其他垃圾回收器是当Eden区满了触发Young GC 而G1则是会预测Eden区回收要多久,如果接近参数配置的时间则会触发Young GC。回收的算法是采用标记复制算法。
  2. Mix GC :混合GC,多数对象晋升到老年代后,为了避免内存耗尽会触发Full GC,回收整个Young Region和部分的Old Region。触发条件当老年代对象占比超过阈值(可配置)
  3. Full GC:对老年代进行垃圾回收,采用标记、清除、压缩相对来说比较耗时。

总结:在Yong GC和Mix GC模式下,G1会对每个Region存活对象进行统计。根据存活对象和闲置的Region数量动态的决定垃圾回收的区域和顺序。这种动态策略可以尽可能的减少Full GC。过程如下:

相关推荐
递归不收敛9 分钟前
Conda 常用命令汇总(新手入门笔记)
笔记·conda
前端橙一陈1 小时前
Salesforce Developer Edition(开发者版) 搭建测试环境
经验分享·笔记·其他
YuanlongWang1 小时前
C#基础——GC(垃圾回收)的工作流程与优化策略
java·jvm·c#
电子小子洋酱1 小时前
BearPi小熊派 鸿蒙入门开发笔记(4)
笔记·华为·harmonyos
白露与泡影1 小时前
BAT 大厂 java高频面试题汇总:JVM+Spring+ 分布式 +tomcat+MyBatis
java·jvm·spring
Han.miracle1 小时前
数据结构——排序的学习(一)
java·数据结构·学习·算法·排序算法
摇滚侠1 小时前
Spring Boot 3零基础教程,WEB 开发 通过配置类代码方式修改静态资源配置 笔记32
java·spring boot·笔记
电子云与长程纠缠2 小时前
Blender入门学习01
学习·blender
それども2 小时前
忽略Lombok构建警告
java·开发语言·jvm
qiuiuiu4132 小时前
正点原子RK3568学习日志12-注册字符设备
linux·开发语言·单片机·学习·ubuntu