JVM - 再聊GC垃圾收集算法及垃圾收集器

简介: JVM - 再聊GC垃圾收集算法及垃圾收集器

20200629220908526.png


Pre


JVM-04垃圾收集Garbage Collection(上)【垃圾对象的判定】

JVM-05垃圾收集Garbage Collection(中)【垃圾收集算法】

JVM-06垃圾收集Garbage Collection(下)【垃圾收集器】


分代收集理论


当前虚拟机的垃圾收集都采用分代收集算法 , 意思就是根据对象存活周期的不同将 java堆分为新生代和老年代,这样就可以根据各个年代的特点选择合适的垃圾收集算法。


举个例子,新生代中,大部分对象都是朝生夕死的,所以可以选择复制算法, 只复制那些少量存活的对象。


而老年代,绝大部分都是一些顽固的对象,存货周期较长,如果选择复制算法,就要复制很多对象,效率自然不高 ,所以得换个算法,通常会选择标记-清除”或“标记-整理”算法进行垃圾收集。


常见的垃圾收集算法


20200629221604292.png

标记-清除算法

两个阶段 “标记” + “清除”

  1. 标记存活的对象, 也可以反过来,标记出所有需要回收的对象
  2. 标记完成后,统一回收所有未被标记的对象(一般选择这种)



20200629222942862.png


存在两个问题

  1. 如果需要标记的对象太多,效率不高 【效率问题】
  2. 标记清除后会产生大量不连续的碎片 【内存碎片】

基于这个缺点,进化除了 标记-整理 ,多了一步整理内存碎片。


标记-复制算法


它将内存分为大小相同的两块,每次使用其中的一块。

当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。

这样就使每次的内存回收都是对内存区间的一半进行回收。

20200629222436784.png


  • 优点:常用于新生代,存活的对象少,复制这些存活的对象,效率高。
  • 缺点 显而易见: 浪费空间

标记-整理算法


根据老年代的特点演化出一种标记算法, 标记过程同“标记-清除” 。

移动所有存活的对象,且按照内存地址次序依次排列,然后将末端内存地址以后的内存全部回收。因此,第二阶段才称为整理阶段。


20180729171526874.jpg


垃圾收集器


20200629225619675.png


为什么会有这么多GC 回收器?


因为目前没有任何一款是十分完美的,我们需要做的就是充分了解这些GC Collector 根据业务特点选择合适的GC Collector 。


Serial收集器


两个收集器 。一个 新生代Serial , 一个 老年代 Serial Old .

新生代采用复制算法,老年代采用标记-整理算法。


JVM参数

-XX:+UseSerialGC (新生代)  -XX:+UseSerialOldGC (老年代)

Serial(串行)收集器是最基本、历史最悠久的垃圾收集器 。


20200629230423264.png


字面意思:

  1. 单线程GC
  2. GC的时候STW
  3. 新生代 Serial , 复制算法
  4. 老年代Serial Old , 标记整理算法

Serial Old收集器是Serial收集器的老年代版本,也是一个单线程收集器。


它主要有两大用途:

  • 一种用途是在JDK1.5以及以前的版本中与Parallel Scavenge收集器搭配使用,
  • 另一种用途是作为CMS收集器的后备方案


Parallel Scavenge收集器 【JDK8默认】

Serial收集器的多线程版本

JVM参数

-XX:+UseParallelGC(年轻代),-XX:+UseParallelOldGC(老年代)

20200629231552988.png



默认的收集线程数跟cpu核数相同,当然也可以用参数(-XX:ParallelGCThreads)指定收集线程数,但是一般不推荐修改。


Parallel Scavenge收集器关注点是吞吐量(高效率的利用CPU)


CMS等垃圾收集器的关注点更多的是用户线程的停顿时间(提高用户体验)


新生代采用复制算法,老年代采用标记-整理算法。


Parallel Old收集器是Parallel Scavenge收集器的老年代版本。使用多线程和“标记-整理”算法。


在注重吞吐量以及CPU资源的场合,都可以优先考虑 Parallel Scavenge收集器和Parallel Old收集器(JDK8默认的新生代和老年代收集器)。


ParNew收集器


What ? ParNew ? 不是有个Parallel 吗? 又出来这个主要是因为Parallel 不能和CMS搭配使用,所以官方又弄出个这么个玩意儿。

JVM参数

-XX:+UseParNewGC


20200629232739724.png


ParNew收集器其实跟Parallel收集器很类似,区别主要在于它可以和CMS收集器配合使用。

新生代采用复制算法,老年代采用标记-整理算法。

互联网公司 小内存的机器 主流的GC组合 就是 ParNew + CMS .


CMS 【重点掌握】


JVM参数

-XX:+UseConcMarkSweepGC(老年代)

20200630001210148.png


详细的四个步骤、CMS存在的问题以及三色标记我们下篇博文继续展开

相关文章
|
4天前
|
存储 监控 Java
JVM实战—8.如何分析jstat统计来定位GC
本文详细介绍了使用jstat、jmap和jhat等工具分析JVM运行状况的方法,以及如何合理优化JVM性能。内容涵盖新生代与老年代对象增长速率、Young GC和Full GC的触发频率及耗时等关键指标的分析。通过模拟BI系统和计算系统的案例,展示了如何根据实际场景调整JVM参数以减少FGC频率,提升系统性能。最后汇总了常见问题及其解决方案,帮助开发者更好地理解和优化JVM运行状态。
JVM实战—8.如何分析jstat统计来定位GC
|
5天前
|
存储 监控 Java
JVM实战—7.如何模拟GC场景并阅读GC日志
本文主要介绍了:如何动手模拟出频繁Young GC的场景、JVM的Young GC日志应该怎么看、编写代码模拟动态年龄判定规则进入老年代、编写代码模拟S区放不下部分进入老年代、JVM的Full GC日志应该怎么看。
JVM实战—7.如何模拟GC场景并阅读GC日志
|
9天前
|
消息中间件 存储 算法
JVM实战—3.JVM垃圾回收的算法和全流程
本文详细介绍了JVM内存管理与垃圾回收机制,涵盖以下内容:对象何时被垃圾回收、垃圾回收算法及其优劣、新生代和老年代的垃圾回收算法、Stop the World问题分析、核心流程梳理。
JVM实战—3.JVM垃圾回收的算法和全流程
|
15天前
|
监控 算法 Java
JVM—垃圾收集算法和HotSpot算法实现细节
JVM的垃圾收集算法和HotSpot的实现细节复杂但至关重要,通过理解和掌握这些算法,可以为Java应用程序选择合适的垃圾收集器,并进行有效的性能调优。选择适当的垃圾收集策略,结合合理的内存配置和日志分析,能够显著提升应用的运行效率和稳定性。
47 15
|
3月前
|
算法 网络协议 Java
【JVM】——GC垃圾回收机制(图解通俗易懂)
GC垃圾回收,标识出垃圾(计数机制、可达性分析)内存释放机制(标记清除、复制算法、标记整理、分代回收)
|
5月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
229 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
4月前
|
存储 监控 Java
JVM进阶调优系列(8)如何手把手,逐行教她看懂GC日志?| IT男的专属浪漫
本文介绍了如何通过JVM参数打印GC日志,并通过示例代码展示了频繁YGC和FGC的场景。文章首先讲解了常见的GC日志参数,如`-XX:+PrintGCDetails`、`-XX:+PrintGCDateStamps`等,然后通过具体的JVM参数和代码示例,模拟了不同内存分配情况下的GC行为。最后,详细解析了GC日志的内容,帮助读者理解GC的执行过程和GC处理机制。
|
4月前
|
算法 Java
JVM有哪些垃圾回收算法?
(1)标记清除算法: 标记不需要回收的对象,然后清除没有标记的对象,会造成许多内存碎片。 (2)复制算法: 将内存分为两块,只使用一块,进行垃圾回收时,先将存活的对象复制到另一块区域,然后清空之前的区域。用在新生代 (3)标记整理算法: 与标记清除算法类似,但是在标记之后,将存活对象向一端移动,然后清除边界外的垃圾对象。用在老年代
43 0
|
5月前
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
269 3
|
4天前
|
算法 数据安全/隐私保护 异构计算
基于LSB最低有效位的音频水印嵌入提取算法FPGA实现,包含testbench和MATLAB对比
本项目展示了一种基于FPGA的音频水印算法,采用LSB(最低有效位)技术实现版权保护与数据追踪功能。使用Vivado2019.2和Matlab2022a开发,完整代码含中文注释及操作视频。算法通过修改音频采样点的最低有效位嵌入水印,人耳难以察觉变化。然而,面对滤波或压缩等攻击时,水印提取可能受影响。该项目运行效果无水印干扰,适合实时应用场景,核心逻辑简单高效,时间复杂度低。