1. G1 GC 的堆内存划分
# G1 采用的多个 Region 的方式划分堆内存,而不是简单的条带状划分方式;但它也有“年代”的概念。
也就是说“年代”在 G1 中是逻辑概念。部分 Region 会标记为属于 Eden,部分属于 Survivor,部分属于老年代。
# 每个 Region 大小相同;
最小值为 1MB,最大值为 32MB;但字节数必须是2的幂。
也可以通过 JVM 启动参数进行设置。如:
-XX:G1HeapRegionSize=16M
# JVM 会尽量划分出 2048 个 Region
class HeapRegionBounds : public AllStatic { private: // Minimum region size; we won't go lower than that. // We might want to decrease this in the future, to deal with small // heaps a bit more efficiently. static const size_t MIN_REGION_SIZE = 1024 * 1024; // Maximum region size; we don't go higher than that. There's a good // reason for having an upper bound. We don't want regions to get too // large, otherwise cleanup's effectiveness would decrease as there // will be fewer opportunities to find totally empty regions after // marking. static const size_t MAX_REGION_SIZE = 32 * 1024 * 1024; // The automatic region size calculation will try to have around this // many regions in the heap (based on the min heap size). static const size_t TARGET_REGION_NUMBER = 2048; public: static inline size_t min_size(); static inline size_t max_size(); static inline size_t target_number(); };
# G1 中的大对象
超过 Region 50% 大小的对象被划分为大对象(Humongous)
大对象一般是大的 byte 或 char 数组
Humongous属于老年代。因为大对象的复制太耗时,所以直接被划为老年代可以减少 Minor GC 的消时。
与条带式划分不同,Region 式的划分可能因为大对象实在太大,而没有连续的 Region 可供放置。
此时可以通过指定一个更大的 Region 容量来规避该问题
2. G1 的基本算法概念
2.1 复合算法
G1 GC 是一种采用复合算法的 GC。
2.1.1 新生代
采用并行的复制算法(这会有 STW 停顿)
2.1.2 老年代
大部分情况下是并发标记(Mark);
整理(Compact)操作是在新生代 GC 时捎带执行的
而且整理操作是增量式的,而整体式整理
2.1.3 GC 状态流转顺序(循环)
1. Minor GC
2. Minor GC + Concurrent Mark
3. Mixed GC
2.1.4 对大对象(Humongous )的特殊“关照”
通常,应用中的大对象数量比较少。G1 利用这点,在 Minor GC 时就会清理大对象(即使它属于老年代)
Minor GC 本就会检查是否有新生代对象引用了大对象;
大对象数量少,所以检查是否有老年代对象引用大对象的的总体耗时(T)也少;
这样,只需额外消耗较短的时间 T,就能确定大对象是否可以被清理;
所以在 Minor GC 中清理大对象也是一种值得的策略。
2.1.5 字符串排重
JDK 8u20 之后,G1 会对字符串进行 排重 ——将指向相同字符串(不同实例)的引用指向同一个字符串引用
Minor GC中,在 Yong GC 后,JVM 会并发地执行该排重操作(不会 STW)
通过 JVM 参数开启该特性:-XX:+UseStringDeduplication
2.1.6 类卸载
JDK 8u40 之后,G1 默认在并发标记结束后就进行类卸载
-XX:+ClassUnloadingWithConcurrentMark
2.2 Minor GC
对新生代的 GC 一般称为 Minor GC
但 G1 的 Minor GC 会涉及 Remembered Set 的处理
2.3 Mixed GC
Mixed GC 包括对新生代和老年代的 GC
G1 的 Mixed GC 会清理部分老年代内存。可通过相关 JVM 参数设置其行为:
设定 Mixed GC 清理老年代内存的触发阀值
老年代Region数与总Region数的比值达到该值时,将在 Mixed GC 中清理老年代
-XX:G1MixedGCLiveThresholdPercent=85
设定 Mixed GC 中清理老年代内存的Region数(比例)
这是相对与总 Region 数的占比
-XX:G1OldCSetRegionThresholdPercent=10
2.4 Remembered Set
它记录了 Region 之间对象的引用关系,用于保证GC时对象被赋值到另一个Region后,其它对象对它的引用仍然有效。
对 Remember Set 的操作占用 G1 很多资源。
Remember Set 通常会占用堆的 20%
Card Table 的扫描和修改是比较耗时的,会直接影响 STW 的时间
Card Table 是Remember Set 的一种实现
相关推荐
Java垃圾回收(GC)机制是Java编程语言中的一个重要特性,它自动管理程序的内存空间,负责识别并清除不再使用的对象,以防止内存泄漏。本文将深入探讨Java GC的工作原理、类型、过程以及优化策略。 一、Java垃圾...
Java垃圾回收器(Garbage Collector, GC)是Java编程语言中的一个重要特性,它负责自动管理内存,自动回收不再使用的对象,以防止内存泄漏。在Java中,程序员无需手动释放内存,这一过程由JVM(Java虚拟机)自动完成...
### Java GC垃圾回收调优指南 #### 概述 在Java开发过程中,垃圾回收(Garbage Collection, GC)是管理内存资源的关键技术之一。合理的GC配置可以显著提高应用程序的性能和稳定性。本指南旨在帮助开发者深入理解...
Java的垃圾回收(Garbage Collection, GC)是一种自动化的内存管理方式,它能够自动识别并释放不再被引用的对象所占用的内存空间,从而避免了程序员手动管理内存带来的各种问题,如内存泄漏等。 ##### 2.2 堆与栈的...
垃圾回收(Garbage Collection, GC)是Java虚拟机自动管理内存的一种方式,旨在自动识别并释放不再使用的对象,从而避免内存泄漏。面试中,理解GC的工作原理和优化策略对于应聘者来说至关重要。 首先,Java内存主要...
Java垃圾回收(Garbage Collection, 简称GC)是JVM(Java Virtual Machine)管理内存的重要机制。在Java应用程序运行过程中,如果发现并回收不再使用的对象,可以防止内存泄漏,确保程序稳定运行。当我们遇到应用...
4. G1 (Garbage-First) GC:新一代的垃圾回收器,目标是实现低延迟,通过分区策略和并发模式,使得垃圾回收更加可控。 四、垃圾回收调优 1. 设置合理的堆大小:根据应用需求调整新生代和老年代的大小,避免过早或过...
Java垃圾回收(Garbage Collection, 简称GC)是Java虚拟机(JVM)管理内存的一种机制,它自动地识别并清理不再使用的对象,从而避免了程序员手动管理内存可能导致的内存泄漏问题。垃圾回收是Java语言的一个重要特性...
《深入理解JVM & G1 GC》一书深入剖析了Java虚拟机(JVM)的工作原理,特别是针对垃圾收集器(GC)中的G1(Garbage-First)算法进行了详尽的探讨。JVM是Java程序运行的基础,它负责解析、编译、执行Java代码,并管理...
4. Major GC:在Java垃圾回收过程中实例生命周期的最后一个阶段。Major GC在垃圾回收过程中扫描属于Old Generation部分的堆内存。 垃圾回收器类型 ------------- Java提供了四种可用的垃圾回收器类型: 1. Serial...
Java垃圾回收是Java虚拟机(JVM)管理内存的关键机制,它自动识别并释放不再使用的对象,以防止内存泄漏,确保程序稳定运行。面试中,理解垃圾回收的原理、算法、收集器及其优缺点,是衡量Java开发者技能的重要标准...
Java 中的垃圾回收器有 Serial 收集器、ParNew 收集器、CMS 收集器、G1 收集器等。其中,Serial 收集器是最早的垃圾回收收集器,采用的是复制算法,应用于新生代;ParNew 收集器是 Serial 收集器的多线程版本,也是...
在Java编程语言中,垃圾回收(Garbage Collection, GC)是一项至关重要的机制,它自动管理内存,释放不再使用的对象,防止内存泄漏。本篇将深入探讨如何监控Java的垃圾回收,帮助开发者提升应用性能和稳定性。 Java...
Java垃圾回收(GC)是Java编程中的核心概念,它负责自动管理内存,释放不再使用的对象,以防止内存泄漏。理解并掌握GC的工作原理对于优化Java应用程序的性能至关重要。以下是关于Java垃圾回收的一些关键知识点: 1....
Java的垃圾回收机制(Garbage Collection,GC)是Java虚拟机(JVM)的一个重要组成部分,它负责自动管理内存的分配和释放,以减轻程序员在内存管理方面的负担,并防止内存泄漏和内存溢出等问题。本文将详细探讨GC的...
- G1(Garbage-First)GC:新一代的垃圾回收器,目标是低暂停时间和可预测的内存使用。 3. 垃圾回收算法: - 标记-清除(Mark-Sweep):首先标记出所有活动对象,然后清除未标记的对象。此算法会产生碎片,效率较...