`

【Java垃圾回收】G1 GC

    博客分类:
  • Java
 
阅读更多

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垃圾回收(GC)机制是Java编程语言中的一个重要特性,它自动管理程序的内存空间,负责识别并清除不再使用的对象,以防止内存泄漏。本文将深入探讨Java GC的工作原理、类型、过程以及优化策略。 一、Java垃圾...

    java垃圾回收器代码举例

    Java垃圾回收器(Garbage Collector, GC)是Java编程语言中的一个重要特性,它负责自动管理内存,自动回收不再使用的对象,以防止内存泄漏。在Java中,程序员无需手动释放内存,这一过程由JVM(Java虚拟机)自动完成...

    Java_GC垃圾回收调优指南

    ### Java GC垃圾回收调优指南 #### 概述 在Java开发过程中,垃圾回收(Garbage Collection, GC)是管理内存资源的关键技术之一。合理的GC配置可以显著提高应用程序的性能和稳定性。本指南旨在帮助开发者深入理解...

    Java垃圾回收原理

    Java的垃圾回收(Garbage Collection, GC)是一种自动化的内存管理方式,它能够自动识别并释放不再被引用的对象所占用的内存空间,从而避免了程序员手动管理内存带来的各种问题,如内存泄漏等。 ##### 2.2 堆与栈的...

    JAVA垃圾回收面试个人总结.doc

    垃圾回收(Garbage Collection, GC)是Java虚拟机自动管理内存的一种方式,旨在自动识别并释放不再使用的对象,从而避免内存泄漏。面试中,理解GC的工作原理和优化策略对于应聘者来说至关重要。 首先,Java内存主要...

    java jstat 查看哪个进程频繁GC垃圾回收

    Java垃圾回收(Garbage Collection, 简称GC)是JVM(Java Virtual Machine)管理内存的重要机制。在Java应用程序运行过程中,如果发现并回收不再使用的对象,可以防止内存泄漏,确保程序稳定运行。当我们遇到应用...

    Java垃圾回收精粹-Part4Java开发Java经验技

    4. G1 (Garbage-First) GC:新一代的垃圾回收器,目标是实现低延迟,通过分区策略和并发模式,使得垃圾回收更加可控。 四、垃圾回收调优 1. 设置合理的堆大小:根据应用需求调整新生代和老年代的大小,避免过早或过...

    java垃圾回收

    Java垃圾回收(Garbage Collection, 简称GC)是Java虚拟机(JVM)管理内存的一种机制,它自动地识别并清理不再使用的对象,从而避免了程序员手动管理内存可能导致的内存泄漏问题。垃圾回收是Java语言的一个重要特性...

    深入理解JVM&G1; GC

    《深入理解JVM & G1 GC》一书深入剖析了Java虚拟机(JVM)的工作原理,特别是针对垃圾收集器(GC)中的G1(Garbage-First)算法进行了详尽的探讨。JVM是Java程序运行的基础,它负责解析、编译、执行Java代码,并管理...

    细述 Java垃圾回收机制→How Java Garbage Collection Works- - Android 1

    4. Major GC:在Java垃圾回收过程中实例生命周期的最后一个阶段。Major GC在垃圾回收过程中扫描属于Old Generation部分的堆内存。 垃圾回收器类型 ------------- Java提供了四种可用的垃圾回收器类型: 1. Serial...

    Java垃圾回收知识,垃圾回收资料

    Java垃圾回收是Java虚拟机(JVM)管理内存的关键机制,它自动识别并释放不再使用的对象,以防止内存泄漏,确保程序稳定运行。面试中,理解垃圾回收的原理、算法、收集器及其优缺点,是衡量Java开发者技能的重要标准...

    浅谈JAVA垃圾回收机制.pdf

    Java 中的垃圾回收器有 Serial 收集器、ParNew 收集器、CMS 收集器、G1 收集器等。其中,Serial 收集器是最早的垃圾回收收集器,采用的是复制算法,应用于新生代;ParNew 收集器是 Serial 收集器的多线程版本,也是...

    成为JavaGC专家PartII-如何监控Java垃圾回收

    在Java编程语言中,垃圾回收(Garbage Collection, GC)是一项至关重要的机制,它自动管理内存,释放不再使用的对象,防止内存泄漏。本篇将深入探讨如何监控Java的垃圾回收,帮助开发者提升应用性能和稳定性。 Java...

    java垃圾回收知识全集

    Java垃圾回收(GC)是Java编程中的核心概念,它负责自动管理内存,释放不再使用的对象,以防止内存泄漏。理解并掌握GC的工作原理对于优化Java应用程序的性能至关重要。以下是关于Java垃圾回收的一些关键知识点: 1....

    Java中的垃圾回收机制(GC):深入理解与代码实践

    Java的垃圾回收机制(Garbage Collection,GC)是Java虚拟机(JVM)的一个重要组成部分,它负责自动管理内存的分配和释放,以减轻程序员在内存管理方面的负担,并防止内存泄漏和内存溢出等问题。本文将详细探讨GC的...

    Java 垃圾回收小结(一)

    - G1(Garbage-First)GC:新一代的垃圾回收器,目标是低暂停时间和可预测的内存使用。 3. 垃圾回收算法: - 标记-清除(Mark-Sweep):首先标记出所有活动对象,然后清除未标记的对象。此算法会产生碎片,效率较...

Global site tag (gtag.js) - Google Analytics