垃圾收集器(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)
与 “标记 - 清除” 类似。但它会在清理过程中移动对象,使对象占用连续的内存空间。这样可以减少内存碎片。
相关推荐
内容可能包括不同类型的垃圾收集器和内存区域。 9. **Java虚拟机(JVM)优化**:通过分析和调整JVM参数,可以提高应用程序的性能。书中可能涵盖类加载、方法区、堆内存的优化策略。 10. **Java EE相关技术**:虽然...
- **GC收集器**:包括Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1等不同的垃圾收集器,每种收集器有自己的适用场景。 ### 多线程并发 多线程和并发是现代编程中的关键概念,涉及到线程...
理解Java内存模型(JMM)和垃圾收集机制对于优化程序性能至关重要。你将学习到堆内存的划分、对象的生命周期、引用类型,以及各种垃圾收集算法如标记-清除、复制、标记-整理和分代收集。 **6. 异常处理** 异常处理...
6. **JVM优化**:熟悉JVM的工作原理,包括类加载机制、内存模型(堆、栈、方法区等)、垃圾收集器和内存调优,有助于编写出性能更好的程序。 7. **反射**:反射允许在运行时动态地获取类的信息并操作对象,是Java中...
10. **设计模式**:Java进阶往往涉及到面向对象设计原则和常见设计模式,如工厂模式、单例模式、观察者模式、装饰器模式等,这些模式是解决特定问题的通用解决方案。 11. **模块化系统(Jigsaw)**:Java 9引入了模块...
6. **JVM原理**:理解Java内存模型,包括堆、栈、方法区、本地方法栈等,以及垃圾收集机制。 7. **Spring框架**:介绍Spring框架的基本概念,如依赖注入、AOP(面向切面编程)和Spring Boot。 8. **数据库连接**:...
可能讲解了堆内存、栈内存、方法区的概念,以及垃圾收集机制。 10. **注解(Annotation)**:注解提供了一种元数据方式,可以用于编译时或运行时的处理。习题可能包含了自定义注解及其处理器的实现。 通过这个...
- **G1收集器**:一个面向服务端应用的垃圾收集器,将堆内存分割成多个大小相等的独立区域。 ### Java IO/NIO Java的IO和NIO是处理输入/输出流的基础。IO主要是阻塞式的,而NIO提供了非阻塞式和基于选择器的IO。 -...
6. **设计模式**:在Java开发中,了解和应用常见的设计模式(如单例、工厂、观察者、装饰器、代理等)能够提升代码的可读性和可维护性。 7. **泛型**:Java泛型提供了类型安全的容器,避免了强制类型转换并减少了...
以下是对"JAVA核心面试知识整理(283页).pdf"中提及的部分内容的详细解释: 1. JVM(Java虚拟机) JVM是Java的核心组成部分,它负责解析并执行Java字节码,为Java程序提供了一个运行环境。JVM通过类装载器、执行...
- **垃圾收集**:探讨各种垃圾回收器(如Serial、Parallel、CMS、G1)的原理和调优。 - **类加载机制**:理解双亲委派模型,探究类加载过程。 6. **设计模式** - **常见23种设计模式**:如单例、工厂、观察者、...
10. **面试技巧**:"Java八股文"通常指的是面试中常问的问题,如Java内存模型、垃圾收集算法、JVM调优、并发编程难题等。熟悉这些问题并能给出清晰解答,将大大增加面试成功的几率。 在"项目说明.zip"中,可能包含...
另外,Java 11还添加了对字符串中重复模式的删除功能,以及对ZGC(Z Garbage Collector)的实验性支持,这是一种低延迟的垃圾收集器。 第四章,Java 12:这个版本引入了一个名为“Switch Expressions”的实验性特性...
了解JVM内存模型(包括堆、栈、方法区、本地方法栈和程序计数器),熟悉垃圾收集机制(如新生代、老年代、Minor GC和Full GC),以及如何进行性能调优(比如通过JVM参数调整内存大小、开启GC日志等)。 2. **数据...
"JAVA核心知识点整理.zip"这个压缩包文件包含了对Java进阶学习的重要知识点的详细概述,主要集中在PDF文档"JAVA核心知识点整理.pdf"中。以下是这份资料可能涵盖的主要内容: 1. **Java基础**:首先,你会学到Java的...
11. **JVM 内存管理**:理解堆内存、栈内存、方法区、垃圾回收机制(如分代收集、G1 垃圾收集器)以及内存泄漏的诊断和优化,对性能调优至关重要。 12. **模块化系统(Java 9+)**:Java 9 引入了模块系统,提高了...
8. **垃圾收集与内存管理**:Java的自动内存管理是其魅力之一。书中探讨了垃圾收集的工作原理、内存泄漏的预防,以及如何调整JVM参数以优化性能。 9. **设计模式**:作为软件工程的最佳实践,设计模式在提高代码...
在本总结中,我们将深入探讨三个重要的Java面试题目,这些题目涵盖了基础、进阶和实战应用,对于理解Java的核心概念和技术至关重要。 1. **Java内存管理与垃圾收集** - **内存区域**:Java程序在运行时会使用堆...
7. **JVM优化**:学习JVM内部工作原理,包括垃圾收集机制、内存模型、类加载机制,以及如何通过JMX监控和调优JVM参数。 8. **Spring框架**:Spring是Java企业级应用中的核心框架,学习其依赖注入、AOP(面向切面...
9. **内存管理与垃圾收集**:Java使用垃圾收集器自动管理内存,讲解内存模型、对象的生命周期、引用类型以及如何避免内存泄漏。 10. **枚举与注解**:枚举类型是Java 5引入的新特性,用于表示一组固定的值。注解...