数哥:今天 05-20 据说这是一个节日?
我:不知道
数哥:那你今天怎么过?
我:撸起袖子-撸代码

一、GC算法

1、标记-清除算法

描述:

  1. 标记。从根结点(GC root)出发遍历对象,对访问过的对象打上标记,表示该对象可达。
  2. 清除。对那些没有标记的对象进行回收,这样使得不能利用的空间能够重新被利用。

优点

  • 实现简单
  • 不移动对象,

缺点:

  • 清理出来的空闲内存是不连续的
  • 效率比较低(递归与全堆对象遍历),而且在进行GC的时候,需要停止应用程序

2、标记-压缩算法(标记-整理)

描述:

  1. 从GCroot 开始遍历,标记活动的对象
  2. 清除没有被标记的空间
  3. 对空间碎片重排,变紧凑

优点:

  • 无内存碎片
  • 相对内存复制 不会浪费内存空间

缺点:

  • 压缩花费计算成本大

3、复制算法

描述:

  1. 在from区中,从GCroot 开始遍历,标记活动的对象
  2. 清除没有被标记的空间
  3. 将from区中 存活的对象空间 copy到 to 区
  4. 将from区和to区的 指针表示 swap

优点

  • 优秀的吞吐量
  • 可实现高速分配
  • 不会发生碎片化
  • 与缓存兼容

缺点:

  • 堆使用率低下
  • 不兼容保守式GC算法

4、分代收集算法

分代算法主要就是基于以上三种算法 ”因才施教“;

不同的区域使用 适合的算法;

具体的各种垃圾收集器 就是很好的实现

二、垃圾收集器

1.串行收集器

1)Serial收集器
特点:

​ 1、用于新生代

​ 2、使用复制算法

​ 3、单线程运行-进行垃圾收集时,暂停所有工作线程,即"Stop The World"

2)Serial-old
特点:

​ 1、用于老年代

​ 2、使用标记整理算法

​ 3、单线程运行-进行垃圾收集时,暂停所有工作线程,即"Stop The World"

时序图

设置:“-XX:+UseSerialGC”:添加该参数来显式的使用串行垃圾收集器;

2. 并行收集器

1)ParNew

参数设置:

“-XX:+UseParNewGC”:强制指定使用ParNew;
“-XX:ParallelGCThreads”:指定垃圾收集的线程数量,ParNew默认开启的收集线程与CPU的数量相同;

2)Parallel收集器

Parallel Scavenge收集器类似ParNew收集器,Parallel收集器更关注系统的吞吐量;新生代使用"复制"算法,老年代使用"标记-压缩"

Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和"标记压缩"算法

参数设置:

-XX:+UseParallelGC 使用Parallel收集器+老年代串行

-XX:+UseParallelOldGC 使用Parallel收集器+老年代并行

3)CMS收集器(14版本 已经移除)

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器;

老年代收集器(新生代使用ParNew)老年代收集器(新生代使用ParNew);

初始标记、重新标记这两个步骤仍然需要"Stop The World";

优点:并发收集、低停顿
缺点:产生大量空间碎片、并发阶段会降低吞吐量

参数设置:

-XX:+UseConcMarkSweepGC 使用CMS收集器
-XX:+UseCMSCompactAtFullCollection "Full GC"后,进行一次碎片整理,整理过程是独占的,会引起停顿时间变长
-XX:+CMSFullGCsBeforeCompaction 设置进行几次Full GC后,进行一次碎片整理
-XX:ParallelCMSThreads 设定CMS的线程数量(一般情况约等于可用CPU数量)

4)G1收集器

G1收集器有以下特点:

  1. 空间整合,G1收集器采用"标记-压缩"算法,不会产生内存空间碎片。分配大对象时不会因为无法找到连续空间而提前触发下一次GC。
  2. 可预测停顿,这是G1的另一大优势,降低停顿时间是G1和CMS的共同关注点,但G1除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为N毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒,这几乎已经是实时Java(RTSJ)的垃圾收集器的特征了。

与其他垃圾收集器的区别:

上面提到的垃圾收集器,收集的范围都是整个新生代或者老年代;使用G1收集器时,Java堆的内存布局与其他收集器有很大差别,它将整个Java堆划分为多个大小相等的独立区域(Region),虽然还保留有新生代和老年代的概念,新生代和老年代不再是物理隔阂,它们都是一部分(可以不连续)Region的集合

收集步骤:

  1. 标记阶段,首先初始标记(Initial-Mark),这个阶段是停顿的(Stop the World Event),并且会触发一次普通Mintor GC,对应GC log:GC pause (young) (inital-mark)
  2. Root Region Scanning,程序运行过程中会回收survivor区(存活到老年代),这一过程必须在young GC之前完成。
  3. Concurrent Marking,在整个堆中进行并发标记(和应用程序并发执行),此过程可能被young GC中断。在并发标记阶段,若发现区域对象中的所有对象都是垃圾,那个这个区域会被立即回收(图中打X)。同时,并发标记过程中,会计算每个区域的对象活性(区域中存活对象的比例)。
  4. Remark, 再标记,会有短暂停顿(STW)。再标记阶段是用来收集 并发标记阶段 产生新的垃圾(并发阶段和应用程序一同运行);G1中采用了比CMS更快的初始快照算法:snapshot-at-the-beginning (SATB)。
  5. Copy/Clean up,多线程清除失活对象,会有STW。G1将回收区域的存活对象拷贝到新区域,清除Remember Sets,并发清空回收区域并把它返回到空闲区域链表中。
  6. 复制/清除过程后。回收区域的活性对象已经被集中回收到深褐色和深绿色区域,未回收的部分保持原位置。


参数解析

-XX:+UseG1GC 采用 Garbage First (G1) 收集器
-XX:G1HeapRegionSize=n 使用G1时Java堆会被分为大小统一的的区(region)。此参数可以指定每个heap区的大小. 默认值将根据 heap size 算出最优解. 最小值为 1Mb, 最大值为 32Mb.
-XX:G1HeapWastePercent 指定触发Mixed GC的堆垃圾占比,默认值5%
-XX:G1MixedGCLiveThresholdPercent 指定被纳入Cset的Region的存活空间占比阈值
-XX:G1MixedGCCountTarget 指定一个周期内触发Mixed GC最大次数,默认值8
-XX:G1HeapRegionSize=n 使用G1,Java堆被划分为大小均匀的区域。这个参数配置各个子区域的大小。此参数的默认值根据堆大小的人工进行确定。最小值为 1Mb 且最大值为 32Mb。
-XX:G1ReservePercent=n 设置作为空闲空间的预留内存百分比以降低晋升失败的可能性。默认值10
-XX:G1PrintRegionLivenessInfo 默认值false, 在情理阶段的并发标记环节,输出堆中的所有 regions 的活跃度信息
-XX:G1PrintHeapRegions 默认值false, G1 将输出那些 regions 被分配和回收的信息
-XX:+PrintGC 打印GC日志
-XX:+PrintGCDetails 打印详细GC日志
-Xloggc:/tmp/spark.gc.log 指定GC日志路径
-XX:+PrintGCDateStamps 打印可读的日期时间戳 比如2018-11-12
-XX:+PrintGCTimeStamps 打印可读的时间戳 比如 09:10:11
-XX:+PrintAdaptiveSizePolicy 启用自适应大小(为了避免fullGC,允许改变eden空间和survivor空间大小)
-XX:MaxGCPauseMillis=n 设置最大GC 暂停时间。这是一个大概值,JVM 会尽可能的满足此值
-XX:InitiatingHeapOccupancyPercent=n 设置触发标记周期的 Java 堆占用率阈值。默认占用率是整个 Java 堆的 45%。默认值 45.
-XX:NewRatio=n new/old 年代的大小比例. 默认值 2.
-XX:SurvivorRatio=n eden/survivor 空间的大小比例. 默认值 8.
-XX:MaxTenuringThreshold=n 对象晋升年代的最大阀值。默认值 15.这个参数需要注意的是:最大值是15,不要超过这个数啊,要不然会被人笑话。原因为:JVM内部使用 4 bit (1111)来表示这个数。
-XX:ParallelGCThreads=n 设置在垃圾回收器的并行阶段使用的线程数。默认值因与 JVM 运行的平台而不同。
-XX:ConcGCThreads=n 并发垃圾收集器使用的线程数。默认值因与 JVM 运行的平台而不同。
-XX:+PrintSafepointStatistics 输出具体的停顿原因
-XX: PrintSafepointStatisticsCount=1 输出具体的停顿原因
-XX:+PrintGCApplicationStoppedTime 停顿时间输出到GC日志中
-XX:-UseBiasedLocking 取消偏向锁
-XX:+UseGCLogFileRotation 开启滚动日志输出,避免内存被浪费
-XX:+PerfDisableSharedMem 关闭 jstat 性能统计输出特性,使用 jmx 代替

GC日志解析

young GC

717180.116: Total time for which application threads were stopped: 0.0052439 seconds, Stopping threads took: 0.0001552 seconds
717180.160: Total time for which application threads were stopped: 0.0010924 seconds, Stopping threads took: 0.0001561 seconds
717181.045: [GC pause (G1 Evacuation Pause) (young), 0.0040892 secs][Parallel Time: 3.2 ms, GC Workers: 8][GC Worker Start (ms): Min: 717181044.8, Avg: 717181044.9, Max: 717181044.9, Diff: 0.1][Ext Root Scanning (ms): Min: 1.1, Avg: 1.5, Max: 3.0, Diff: 1.9, Sum: 11.8][Update RS (ms): Min: 0.0, Avg: 0.8, Max: 1.2, Diff: 1.2, Sum: 6.1][Processed Buffers: Min: 0, Avg: 4.8, Max: 13, Diff: 13, Sum: 38][Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.3][Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0][Object Copy (ms): Min: 0.1, Avg: 0.8, Max: 1.0, Diff: 0.8, Sum: 6.5][Termination (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.1][Termination Attempts: Min: 1, Avg: 3.2, Max: 6, Diff: 5, Sum: 26][GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.2][GC Worker Total (ms): Min: 3.1, Avg: 3.1, Max: 3.2, Diff: 0.1, Sum: 25.0][GC Worker End (ms): Min: 717181048.0, Avg: 717181048.0, Max: 717181048.0, Diff: 0.0][Code Root Fixup: 0.1 ms][Code Root Purge: 0.0 ms][Clear CT: 0.1 ms][Other: 0.6 ms][Choose CSet: 0.0 ms][Ref Proc: 0.1 ms][Ref Enq: 0.0 ms][Redirty Cards: 0.1 ms][Humongous Register: 0.0 ms][Humongous Reclaim: 0.0 ms][Free CSet: 0.1 ms][Eden: 410.0M(410.0M)->0.0B(410.0M) Survivors: 2048.0K->2048.0K Heap: 582.2M(688.0M)->172.5M(688.0M)][Times: user=0.03 sys=0.00, real=0.00 secs]
717181.049: Total time for which application threads were stopped: 0.0052664 seconds, Stopping threads took: 0.0001628 seconds
717181.624: Total time for which application threads were stopped: 0.0010329 seconds, Stopping threads took: 0.0001591 seconds
717181.981: [GC pause (G1 Evacuation Pause) (young), 0.0041056 secs][Parallel Time: 3.2 ms, GC Workers: 8][GC Worker Start (ms): Min: 717181981.1, Avg: 717181981.1, Max: 717181981.1, Diff: 0.1][Ext Root Scanning (ms): Min: 1.0, Avg: 1.4, Max: 3.1, Diff: 2.0, Sum: 11.6][Update RS (ms): Min: 0.0, Avg: 0.7, Max: 1.1, Diff: 1.1, Sum: 5.8][Processed Buffers: Min: 0, Avg: 4.1, Max: 11, Diff: 11, Sum: 33][Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.3][Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0][Object Copy (ms): Min: 0.0, Avg: 0.7, Max: 0.9, Diff: 0.9, Sum: 5.9][Termination (ms): Min: 0.0, Avg: 0.1, Max: 0.1, Diff: 0.1, Sum: 0.8][Termination Attempts: Min: 1, Avg: 1.4, Max: 2, Diff: 1, Sum: 11][GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.2][GC Worker Total (ms): Min: 3.0, Avg: 3.1, Max: 3.1, Diff: 0.1, Sum: 24.6][GC Worker End (ms): Min: 717181984.2, Avg: 717181984.2, Max: 717181984.2, Diff: 0.0][Code Root Fixup: 0.1 ms][Code Root Purge: 0.0 ms][Clear CT: 0.1 ms][Other: 0.7 ms][Choose CSet: 0.0 ms][Ref Proc: 0.2 ms][Ref Enq: 0.0 ms][Redirty Cards: 0.1 ms][Humongous Register: 0.0 ms][Humongous Reclaim: 0.0 ms][Free CSet: 0.1 ms][Eden: 410.0M(410.0M)->0.0B(410.0M) Survivors: 2048.0K->2048.0K Heap: 582.5M(688.0M)->172.3M(688.0M)][Times: user=0.03 sys=0.00, real=0.01 secs]
717181.985: Total time for which application threads were stopped: 0.0052631 seconds, Stopping threads took: 0.0001380 seconds
717182.248: Total time for which application threads were stopped: 0.0010698 seconds, Stopping threads took: 0.0001791 seconds
717182.920: [GC pause (G1 Evacuation Pause) (young), 0.0040621 secs][Parallel Time: 3.2 ms, GC Workers: 8][GC Worker Start (ms): Min: 717182920.1, Avg: 717182920.1, Max: 717182920.2, Diff: 0.1][Ext Root Scanning (ms): Min: 1.1, Avg: 1.5, Max: 3.1, Diff: 2.0, Sum: 12.0][Update RS (ms): Min: 0.0, Avg: 0.6, Max: 1.0, Diff: 1.0, Sum: 4.6][Processed Buffers: Min: 0, Avg: 3.5, Max: 8, Diff: 8, Sum: 28][Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.3][Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0][Object Copy (ms): Min: 0.0, Avg: 0.7, Max: 0.9, Diff: 0.9, Sum: 5.9][Termination (ms): Min: 0.0, Avg: 0.2, Max: 0.3, Diff: 0.3, Sum: 1.9][Termination Attempts: Min: 1, Avg: 2.1, Max: 5, Diff: 4, Sum: 17][GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.2][GC Worker Total (ms): Min: 3.1, Avg: 3.1, Max: 3.1, Diff: 0.1, Sum: 24.8][GC Worker End (ms): Min: 717182923.2, Avg: 717182923.2, Max: 717182923.2, Diff: 0.0][Code Root Fixup: 0.1 ms][Code Root Purge: 0.0 ms][Clear CT: 0.1 ms][Other: 0.6 ms][Choose CSet: 0.0 ms][Ref Proc: 0.1 ms][Ref Enq: 0.0 ms][Redirty Cards: 0.1 ms][Humongous Register: 0.0 ms][Humongous Reclaim: 0.0 ms][Free CSet: 0.2 ms][Eden: 410.0M(410.0M)->0.0B(410.0M) Survivors: 2048.0K->2048.0K Heap: 582.3M(688.0M)->172.4M(688.0M)][Times: user=0.02 sys=0.00, real=0.01 secs]
717182.924: Total time for which application threads were stopped: 0.0052128 seconds, Stopping threads took: 0.0001624 seconds
717183.596: Total time for which application threads were stopped: 0.0010477 seconds, Stopping threads took: 0.0001578 seconds
717183.854: [GC pause (G1 Evacuation Pause) (young), 0.0044851 secs]

mixed GC

G1 解析

https://zhuanlan.zhihu.com/p/130992385

https://www.jianshu.com/p/333147dc741a

G1日志解析

https://www.cnblogs.com/felixzh/p/11526306.html

https://blog.csdn.net/weixin_37275456/article/details/113351677

5)ZGC (11版本 新增)

在JDK 11当中,加入了实验性质的ZGC。它的回收耗时平均不到2毫秒。它是一款低停顿高并发的收集器。

ZGC几乎在所有地方并发执行的,除了初始标记的是STW的。所以停顿时间几乎就耗费在初始标记上,这部分的实际是非常少的。那么其他阶段是怎么做到可以并发执行的呢?

ZGC主要新增了两项技术,一个是着色指针Colored Pointer,另一个是读屏障Load Barrier

着色指针Colored Pointer
ZGC利用指针的64位中的几位表示Finalizable、Remapped、Marked1、Marked0(ZGC仅支持64位平台),以标记该指向内存的存储状态。相当于在对象的指针上标注了对象的信息。注意,这里的指针相当于Java术语当中的引用。

在这个被指向的内存发生变化的时候(内存在Compact被移动时),颜色就会发生变化。

在G1的时候就说到过,Compact阶段是需要STW,否则会影响用户线程执行。那么怎么解决这个问题呢?

读屏障Load Barrier 由于着色指针的存在,在程序运行时访问对象的时候,可以轻易知道对象在内存的存储状态(通过指针访问对象),若请求读的内存在被着色了。那么则会触发读屏障。读屏障会更新指针再返回结果,此过程有一定的耗费,从而达到与用户线程并发的效果。

常用的垃圾收集器组合

新生代 老年代
Serial Serial Old
Serial CMS + Serial Old
ParNew CMS
ParNew Serial Old
Parallel Scavenge Serial Old
Parallel Scavenge Parallel Old
G1 G1

GC分析工具 https://gceasy.io

个人水平有限,如有问题,欢迎大家留言指出,虚心接受,及时更正

如果大家觉得,还可以,烦请点赞收藏,谢谢

JVM-GC算法及垃圾收集器超级详细解读(520 是什么? 不存在)相关推荐

  1. Java常见GC算法_垃圾收集器及内存分配_G1垃圾收集器

    常见GC算法 引用计数法: 每个对象都有一个计数器, 对象被引用一次, 计数器+1, 当对象引用失败一次. 计数器-1, 当对象计数器等于0, 说明对象没有被应用, 就可GC 优: 运行过程中, 可随 ...

  2. jvm相关,垃圾收集算法,垃圾收集器,jvm调优--学习笔记

    对内存合理分配,优化jvm 参数,就是为了尽可能减少新生代(Minor GC),或者是整个老年代(Major GC) ,或者是整个 Java 堆 (Full GC) ,尽量减少 GC 带来的系统停顿, ...

  3. JVM初探- 内存分配、GC原理与垃圾收集器

    JVM初探- 内存分配.GC原理与垃圾收集器 标签 : JVM JVM内存的分配与回收大致可分为如下4个步骤: 何时分配 -> 怎样分配 -> 何时回收 -> 怎样回收. 除了在概念 ...

  4. JVM结构、内存分配、垃圾回收算法、垃圾收集器。

    2019独角兽企业重金招聘Python工程师标准>>> 一.JVM结构 根据<java虚拟机规范>规定,JVM的基本结构一般如下图所示: 从左图可知,JVM主要包括四个部 ...

  5. JVM的7种垃圾收集器

    原文地址:Java虚拟机垃圾回收(三) 7种垃圾收集器 Java虚拟机垃圾回收(三) 7种垃圾收集器 主要特点 应用场景 设置参数 基本运行原理 在<Java虚拟机垃圾回收(一) 基础>中 ...

  6. 备战面试日记(2.4) - (JVM.GC算法)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.2 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...

  7. 深入理解java虚拟机之——垃圾回收(垃圾判断,垃圾收集算法,垃圾收集器)

    java与C++之间有一道动态内存分配和垃圾收集的"墙",墙里面的人想出来,墙外边的人想进去,或许只有骑在墙上才能清楚的了解,墙内墙外都是牢笼. 上面一句出自<深入理解jav ...

  8. JVM堆内存与垃圾收集器

    3.1 谈谈Java中不同的引用类型? Java里有不同的引用类型,分别是强引用.软引用.弱引用和虚引用; 强引用:Object object = new Object();即使内存溢出了也不会回收这 ...

  9. Hotspot虚拟机- 垃圾收集算法和垃圾收集器

    引言 声明:由于CSDN不支持Hexo支持的Markdown语法,大家看到{% asset_img 1st.png Mark and Sweep %}这样的标签时,就是一张图片.由于图片较多,我就不一 ...

最新文章

  1. Linux下*.tar.bz2等文件如何解压--转
  2. 基于SSM实现校园失物招领系统
  3. 第九课 特殊权限set_uid、stick_bit,软链接,硬链接
  4. 想避免宕机,数据中心运营商还要不断演练实践
  5. 焊接符号标注图解示例_【干货】焊接图纸符号汇总 ,学习收藏!!
  6. Docker中安装Jenkins实时发布.net core 项目(一)
  7. vue弹层时禁止页面滚动
  8. C++自学17:goto
  9. luoguP4705 玩游戏
  10. Java Web(一) Servlet详解!!
  11. 绥化二中高考成绩查询2021,2014绥化中考
  12. Packet Tracer 思科模拟器入门教程 实验报告1
  13. MC9S12 RTI 时钟的设置
  14. 70句计算机英语,70句必背的经典英文电影台词(中英双语)
  15. [PDDL人工智能] 01.PDDL规划器安装及入门详解(规划领域定义语言)
  16. win7连接远程桌面时出现黑屏的解决方法(亲测有效)——终于找到解决办法了
  17. PIX学习路径-1-选择PIXHAWK作为飞控学习的起点
  18. python抓取谷歌指数(Google Trends)
  19. NTT将在全球颇具影响力的技术盛会CES 2021上在线展出
  20. PyQt5教程 QLineEdit 限制输入中文和中文字符,如账号密码框验证

热门文章

  1. 无人机航拍高度与地面采样距离
  2. 员工满意度对企业的重要性
  3. 免费手机网站自助建站平台推荐
  4. leetcode-753: 破解保险箱
  5. 如何 生成7位数随机数
  6. android mtp usb
  7. 汽车零部件开发工具巨头V公司全套OSEK NM协议栈源代码及配置功能,完成集成即可使用,代码稳定高效,大厂出品有量产保证
  8. LeetCode刷题之路:1049. 最后一块石头的重量 II
  9. 视频简历:带刺“玫瑰
  10. Web通用型漏洞简介