`

【Java核心-进阶】常见垃圾收集器

    博客分类:
  • Java
 
阅读更多

垃圾收集器(GC, Garbage Collector)与具体 JVM 实现有关。不同厂商,不同版本的 JVM,其所提供的 GC 也不同。

 

1. 常见GC

1.1 Serial GC

它是 JVM 在 client 模式下的默认设置

“serial”体现在其收集活动是单线程的,且会进入 STW(Stop-The-World)状态。

特点是暂用资源少。

它采用 “标记-整理”算法(Mark - Compact)

JVM参数:-XX:+UseSerialGC

 

1.2 ParNew GC

针对新生代的GC。它是 Serial GC 的多线程版本。

一般配合老年代的 CMS GC 使用。如:

-XX:+UseConcMarkSweepGC -XX:+UseParNewGC

 

1.3 CMS GC (Concurrent Mark Sweep)

基于 “标记-清除” 算法(Mark - Sweep)。其设计目标是尽量减少停顿时间。

它的缺点是会产生内存碎片。应用长时间运行情况下会产生 Full GC,停顿严重。

另外,因为是并发模式进行的,CMS 会占用更多CPU资源(与用户线程争抢)

在 JDK9 中,该GC已被标记为废弃(deprecated)

 

1.4 Parallel GC

它是 JDK8 中 JVM 在 server 模式下的默认设置;被称为 “吞吐量优先” 的GC。

特点是,新生代和老年代 GC 都是并行的,在常见服务器环境中更高效。

JVM参数:

开启Parallel GC:-XX:+UseParallelGC

设置最长暂停时间:-XX:MaxGCPauseMillis=value

设置GC时间和用户时间比:-XX:GCTimeRatio=value

 

1.5 G1 GC

兼顾吞吐量和停顿时间的GC。这是 JDK9 之后 server 模式下的默认设置

G1 未必能做到 CMS 在最好情况下的延时停顿,但最差情况要好得多。

G1 的堆内存分配有年代之分,但不是简单的条带式划分,而是一个个 Region。

Region 之间采用复制算法,但整体上是 “标记 - 整理” 算法,可以有效避免内存碎片。

当堆容量非常大时(大于 16G),G1 的优势很明显。

总体而言 G1 的吞吐量和停顿表现都不错,值得使用。

 

 

2. 垃圾收集的原理

2.1 识别哪些内存可以被释放

2.1.1 对于堆中的对象

有两种基本算法来判断某个对象是否可以被回收:

2.1.1.1 引用计数

记录每个对象被引用的数量(扇入);当该计数为0时,表示它可以被回收。

因为很难处理循环引用的场景,Java 采用的是可达性分析

 

2.1.1.2 可达性分析

将所有对象及其引用关系当作一个图;

把其中活动的对象作为 GC Roots (根引用);

通过追踪引用链判断一个对象是否从 GC Roots 可达;如果不可达,则表示该对象可以被回收。

JVM中,虚拟机栈和本地方法栈中的对象、静态属性引用的对象和常量,都属于 GC Roots

 

2.1.2 对于方法区中的元数据

回收类只能通过回收相应的类加载器实现;

而初始化类加载器只有在退出JVM时才回收,所以一般都是回收被自定义类加载器加载类。

一般在大量使用动态类型的场景下才会有必要回收类,以防止元数据区 OOM。

而且JDK 8u40 以后 G1 默认开启类卸载,所以总体来说不用太担心这方面的问题:

-XX:+ClassUnloadingWithConcurrentMark

 

(可通过设置 JVM 参数 -XX:+TraceClassUnloading 查看类型卸载信息)

 

2.2 常见基本垃圾收集算法

注:现实中 GC 所采用的算法是复合算法,且有并行和并发

 

2.2.1 复制

将活着的对象复制到另一块区域,且在这个过程中将这些对象放到连续内存空间,以此减少内存碎片。

缺点:因为要预留一块内存进行复制,这块内存区域不能用于实际的业务,所以有一定的浪费。

在 G1 GC 中还需额外维护 Region 之间的对象引用关系。

 

2.2.2 标记 - 清除 (Mark - Sweep)

先将所有需要被回收的对象标记出来,然后再进行清除。

缺点:容易出现内存碎片,Full GC 时暂停时间过长,不适合大堆。

 

2.2.3 标记 - 整理(Mark - Compact)

与 “标记 - 清除” 类似。但它会在清理过程中移动对象,使对象占用连续的内存空间。这样可以减少内存碎片。

分享到:
评论

相关推荐

    [Java语言程序设计-进阶篇(原书第8版)]

    内容可能包括不同类型的垃圾收集器和内存区域。 9. **Java虚拟机(JVM)优化**:通过分析和调整JVM参数,可以提高应用程序的性能。书中可能涵盖类加载、方法区、堆内存的优化策略。 10. **Java EE相关技术**:虽然...

    JAVA架构师进阶之路核心知识整理.pdf

    - **GC收集器**:包括Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1等不同的垃圾收集器,每种收集器有自己的适用场景。 ### 多线程并发 多线程和并发是现代编程中的关键概念,涉及到线程...

    java进阶篇主要内容的PPT

    理解Java内存模型(JMM)和垃圾收集机制对于优化程序性能至关重要。你将学习到堆内存的划分、对象的生命周期、引用类型,以及各种垃圾收集算法如标记-清除、复制、标记-整理和分代收集。 **6. 异常处理** 异常处理...

    Java进阶编程(经典网帖合集)

    6. **JVM优化**:熟悉JVM的工作原理,包括类加载机制、内存模型(堆、栈、方法区等)、垃圾收集器和内存调优,有助于编写出性能更好的程序。 7. **反射**:反射允许在运行时动态地获取类的信息并操作对象,是Java中...

    Java语言程序设计进阶篇答案与代码

    10. **设计模式**:Java进阶往往涉及到面向对象设计原则和常见设计模式,如工厂模式、单例模式、观察者模式、装饰器模式等,这些模式是解决特定问题的通用解决方案。 11. **模块化系统(Jigsaw)**:Java 9引入了模块...

    Java基础和进阶学习.rar

    6. **JVM原理**:理解Java内存模型,包括堆、栈、方法区、本地方法栈等,以及垃圾收集机制。 7. **Spring框架**:介绍Spring框架的基本概念,如依赖注入、AOP(面向切面编程)和Spring Boot。 8. **数据库连接**:...

    《Java语言程序设计(进阶篇)》 课后习题第23章代码chapter23.rar

    可能讲解了堆内存、栈内存、方法区的概念,以及垃圾收集机制。 10. **注解(Annotation)**:注解提供了一种元数据方式,可以用于编译时或运行时的处理。习题可能包含了自定义注解及其处理器的实现。 通过这个...

    2020年最新Java核心知识点整理.pdf

    - **G1收集器**:一个面向服务端应用的垃圾收集器,将堆内存分割成多个大小相等的独立区域。 ### Java IO/NIO Java的IO和NIO是处理输入/输出流的基础。IO主要是阻塞式的,而NIO提供了非阻塞式和基于选择器的IO。 -...

    Java进阶基础.zip

    6. **设计模式**:在Java开发中,了解和应用常见的设计模式(如单例、工厂、观察者、装饰器、代理等)能够提升代码的可读性和可维护性。 7. **泛型**:Java泛型提供了类型安全的容器,避免了强制类型转换并减少了...

    JAVA核心面试知识整理(283页).pdf

    以下是对"JAVA核心面试知识整理(283页).pdf"中提及的部分内容的详细解释: 1. JVM(Java虚拟机) JVM是Java的核心组成部分,它负责解析并执行Java字节码,为Java程序提供了一个运行环境。JVM通过类装载器、执行...

    Java 工程师进阶知识完全扫盲

    - **垃圾收集**:探讨各种垃圾回收器(如Serial、Parallel、CMS、G1)的原理和调优。 - **类加载机制**:理解双亲委派模型,探究类加载过程。 6. **设计模式** - **常见23种设计模式**:如单例、工厂、观察者、...

    Java 工程师进阶知识完全扫盲.zip

    10. **面试技巧**:"Java八股文"通常指的是面试中常问的问题,如Java内存模型、垃圾收集算法、JVM调优、并发编程难题等。熟悉这些问题并能给出清晰解答,将大大增加面试成功的几率。 在"项目说明.zip"中,可能包含...

    Java 9-13.zip

    另外,Java 11还添加了对字符串中重复模式的删除功能,以及对ZGC(Z Garbage Collector)的实验性支持,这是一种低延迟的垃圾收集器。 第四章,Java 12:这个版本引入了一个名为“Switch Expressions”的实验性特性...

    JAVA全栈核心知识点整理-面试

    了解JVM内存模型(包括堆、栈、方法区、本地方法栈和程序计数器),熟悉垃圾收集机制(如新生代、老年代、Minor GC和Full GC),以及如何进行性能调优(比如通过JVM参数调整内存大小、开启GC日志等)。 2. **数据...

    JAVA核心知识点整理.zip

    "JAVA核心知识点整理.zip"这个压缩包文件包含了对Java进阶学习的重要知识点的详细概述,主要集中在PDF文档"JAVA核心知识点整理.pdf"中。以下是这份资料可能涵盖的主要内容: 1. **Java基础**:首先,你会学到Java的...

    hw-java-advanced:进阶 Java 课程 hometasks

    11. **JVM 内存管理**:理解堆内存、栈内存、方法区、垃圾回收机制(如分代收集、G1 垃圾收集器)以及内存泄漏的诊断和优化,对性能调优至关重要。 12. **模块化系统(Java 9+)**:Java 9 引入了模块系统,提高了...

    java语言程序设计提高篇+进阶篇第十版

    8. **垃圾收集与内存管理**:Java的自动内存管理是其魅力之一。书中探讨了垃圾收集的工作原理、内存泄漏的预防,以及如何调整JVM参数以优化性能。 9. **设计模式**:作为软件工程的最佳实践,设计模式在提高代码...

    java面试题_总结(3题)

    在本总结中,我们将深入探讨三个重要的Java面试题目,这些题目涵盖了基础、进阶和实战应用,对于理解Java的核心概念和技术至关重要。 1. **Java内存管理与垃圾收集** - **内存区域**:Java程序在运行时会使用堆...

    java-advanced-training:java进阶训练

    7. **JVM优化**:学习JVM内部工作原理,包括垃圾收集机制、内存模型、类加载机制,以及如何通过JMX监控和调优JVM参数。 8. **Spring框架**:Spring是Java企业级应用中的核心框架,学习其依赖注入、AOP(面向切面...

    java核心技术卷一(英文版mobi格式)

    9. **内存管理与垃圾收集**:Java使用垃圾收集器自动管理内存,讲解内存模型、对象的生命周期、引用类型以及如何避免内存泄漏。 10. **枚举与注解**:枚举类型是Java 5引入的新特性,用于表示一组固定的值。注解...

Global site tag (gtag.js) - Google Analytics