专栏导航
JVM工作原理与实战
RabbitMQ入门指南
从零开始了解大数据
目录
专栏导航
前言
一、垃圾回收器
二、G1垃圾回收器介绍
三、G1垃圾回收器详解
1.G1垃圾回收器的回收方式
2.G1垃圾回收器执行流程
3.垃圾回收器的选择
总结
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了G1垃圾回收器、G1垃圾回收器的回收方式、G1垃圾回收器执行流程、垃圾回收器的选择等内容。
垃圾回收器是Java虚拟机(JVM)中的重要组件,负责自动管理内存,回收不再使用的对象所占用的空间。了解垃圾回收器的种类、工作原理以及如何根据应用场景选择合适的垃圾回收器,对于提高应用程序的性能和稳定性至关重要。
垃圾回收器通过自动检测和回收不再被引用的对象,以释放内存空间,避免内存泄漏。为了实现这一目标,垃圾回收器采用了一系列算法来识别和回收无用对象。这些算法主要包括标记清除、复制、标记整理和分代垃圾回收等。
详细讲解可以查看之前的文章:
JVM工作原理与实战(二十五):堆的垃圾回收-垃圾回收算法-CSDN博客文章浏览阅读1.1k次,点赞31次,收藏18次。JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了垃圾回收算法评价标准、标记清除算法、复制算法、标记整理算法、分代垃圾回收算法等内容。https://blog.csdn.net/jiangyq_/article/details/135764153垃圾回收器分为年轻代和老年代,它们各自负责不同生命周期的对象的回收。除了G1垃圾回收器外,其他垃圾回收器必须成对组合使用,以确保整个堆内存的有效管理。
Serial垃圾回收器、SerialOld垃圾回收器、ParNew垃圾回收器、CMS垃圾回收器、Parallel Scavenge垃圾回收器、Parallel Old垃圾回收器的详细讲解可以查看之前的文章:
JVM工作原理与实战(二十六):堆的垃圾回收-垃圾回收器-CSDN博客文章浏览阅读544次,点赞13次,收藏9次。JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了垃圾回收器、Serial垃圾回收器、SerialOld垃圾回收器、ParNew垃圾回收器、CMS垃圾回收器、Parallel Scavenge垃圾回收器、Parallel Old垃圾回收器等内容。https://blog.csdn.net/jiangyq_/article/details/135814251
G1垃圾回收器(Garbage-First Garbage Collector)是JDK 9及之后版本的默认垃圾回收器。它的设计目标是将Parallel Scavenge和CMS两种垃圾回收器的优点相结合,以提供更好的性能表现。Parallel Scavenge关注吞吐量,允许用户设置最大暂停时间,但会减少年轻代可用空间的大小。相比之下,CMS关注暂停时间,但在吞吐量方面会有所下降。而G1垃圾回收器旨在解决这些问题,以实现更高效和可预测的垃圾回收性能。
G1垃圾回收器的设计特点:
G1垃圾回收器采用了独特的内存管理策略,将整个堆内存划分为多个大小相等的区域,称为Region。这些Region不需要连续存储,提供了更大的灵活性。根据应用程序的需求,这些Region可以配置为Eden区(伊甸园区)、Survivor区(幸存者区)和Old区(老年代),以满足不同的回收需求。与之前的垃圾回收器相比,G1的出现改变了传统的内存管理方式。在G1之前,内存结构一般是连续的,而G1通过将堆内存划分为多个Region,打破了这种连续性。这种设计使得G1能够更好地适应现代计算机系统的内存布局和分配需求,提高了内存利用率和应用程序的性能。
在G1垃圾回收器中,Region的大小是通过堆空间大小除以2048来计算得到的,也可以通过参数-XX:G1HeapRegionSize=来明确指定Region的大小。需要注意的是,Region size必须是2的指数幂,其取值范围是从1M到32M。
-XX:G1HeapRegionSize=
G1垃圾回收器采用复制算法进行垃圾回收,该算法将活跃对象从一个内存区域复制到另一个内存区域,从而实现内存空间的回收。这种算法确保了内存碎片化最小化,提高了空间利用率和应用程序的性能。
G1垃圾回收器的优点:
G1垃圾回收器在吞吐量、延迟控制和内存管理方面具有显著优势。它适用于处理大规模数据和高负载应用程序的场景,尤其适用于对延迟敏感的应用程序和需要高效利用内存资源的应用。但是G1垃圾回收器在JDK 8之前还不够成熟,在JDK 8最新版本和JDK 9及更高版本中,建议默认使用G1作为垃圾回收器,可以使用-XX:+UseG1GC参数来启用G1垃圾回收器,JDK9之后默认不需要启用。
-XX:+UseG1GC
G1垃圾回收器主要采用了两种垃圾回收方式:年轻代回收(Young GC)和混合回收(Mixed GC)。
年轻代回收(Young GC):主要针对Eden区和Survivor区中不再使用的对象进行回收。这个过程会导致应用程序线程暂停(Stop-The-World)。G1垃圾回收器提供了一种灵活的机制,允许开发人员通过参数-XX:MaxGCPauseMillis=n(默认值为200毫秒)来设定每次垃圾回收时的最大暂停时间。这个参数的设置有助于优化应用程序的性能,确保垃圾回收过程对应用程序的影响降至最低。
-XX:MaxGCPauseMillis=n
混合回收(Mixed GC):
G1垃圾回收器的混合回收包括以下步骤:
G1垃圾回收器对老年代的清理策略是选择存活度最低的区域进行回收,这样可以高效地回收内存,这也是G1(Garbage first)名称的由来。在清理阶段,G1使用复制算法,确保内存碎片的最小化。这种混合回收策略允许G1在不影响应用程序性能的情况下有效地管理Java堆的内存。
案例(回收红色区域):
FULL GC:当G1垃圾回收器在执行清理阶段时,如果发现没有足够的空闲Region来存放需要转移的对象,就会触发Full GC,它会暂停所有的用户线程并使用单线程执行标记整理算法进行内存整理。这种操作对应用程序的性能影响较大,因此应尽量避免。为了预防Full GC的发生,开发者应确保分配给应用程序的堆内存有适当的预留空间,避免堆内存过度使用。这样可以减少Full GC的发生频率,并提高应用程序的稳定性和性能。
年轻代回收:
混合回收:
-XX:InitiatingHeapOccupancyPercent
对于JDK 8及更早版本:
对于JDK 9及更高版本:
JVM是Java程序的运行环境,负责字节码解释、内存管理、安全保障、多线程支持、性能监控和跨平台运行。本文主要介绍了G1垃圾回收器、G1垃圾回收器的回收方式、G1垃圾回收器执行流程、垃圾回收器的选择等内容,希望对大家有所帮助。