GC 调优的目标
GC 调优一般是为了:
- 降低内存占用
- 降低延迟
- 增加吞吐量
当然,很难三者都兼顾;一般只能侧重其中一两个。
有时候 GC 参数不合理会导致 OOM,这时候也需要调优。
GC 调优的一般思路
1. 根据实际应用场景确定调优目标
如,GC 停顿时间不能大于200ms,同时吞吐量不能低于每秒 1W 次请求。
所以 GC 调优是非常考验个人技术经验的。如果没有丰富的实践经验作为决策依据,很可能会出一些“拍脑袋”的不现实目标。
2. 分析 JVM 中 GC 的状态,定位问题原因,以确定是否有调优的必要
一般可以通过 jstat 等JVM监控工具、GC日志、操作系统诊断工具等获取JVM相关信息。
如,发现应用在某段时间响应很慢时,可以查看这段时间的GC日志,是否有GC导致长时间的停顿。
也得区分是 Minor GC 耗时过长,还是 Mixed GC 耗时过长。
3. 确定使用哪种 GC
如果应用系统当前所使用的 GC 不符合应用服务特征,就得更换GC。
如,CMS 和 G1 都是更侧重于 低延迟 的GC;Parallel GC 是侧重于 吞吐量 的GC。
如果当前 GC 符合应用特征,那就得考虑更深入的配置调优。
4. 根据实际情况调整相关 JVM 参数或其它软硬件配置
5. 验证调整后的应用已满足目标
如果已达到目标,则结束调优;如果不满足则需重复分析、调整并验证
GC 调优的一般原则
尽量升级到新的 JDK
很多JVM相关问题,在新的 JDK 已经修复或避免。通常而言,升级 JDK 是最好的解决方案。
很多软件组织名为“以稳定为主,保障安全”,实为“缺乏技术能力,缺乏担当”,所以迟迟不升级 JDK。害了不少人。
做好 GC 相关信息的收集
利用 JVM 参数可以获得 GC 相关信息
- -XX:+PrintGCDetails
- JDK 9 中,该选项已被标记为废弃
- 从 JDK 9 开始,可以用 -Xlog:gc 指定相关 GC 日志的记录方式
- 如,指定记录 trace 级别的 GC 日志,日志文件名为 gc.txt,日志文件数最多6个,每个日志文件最大1MB:
- -Xlog:gc=trace:file=gc.txt::filecount=5,filesize=1m
- 6个日志文件:gc.txt、gc.txt.0、gc.txt.1、gc.txt.2、gc.txt.3、gc.txt.4
- 另,可用 java -Xlog:help 查看更多 JVM 日志选项
- -XX:+PrintGCDateStamps
- JDK 9 中,该选项已被移除;可以使用 -Xlog:gc
- -XX:+PrintAdaptiveSizePolicy
- GC 的某些行为是根据运行时情况适应性触发的。通过查看该参数相关功能返回的GC信息,有助于我们理解为什么GC出现了我们不希望发生的操作。
- -XX:+PrintReferenceGC
- 如果怀疑引用清理不及时,通过这些信息可以发现哪里出现了堆积情况
- JDK 9 开始,可以用 -Xlog:gc+ref
- 另外,可以通过 -XX:+ParallelRefProcEnabled 开启对引用的并行处理
相关推荐
本书可能会深入探讨JVM的架构、内存区域划分、垃圾回收机制(GC)等主题,并提供一些调优技巧。 ### Java标准库与工具 除了上述技术点外,本书还可能包括对Java标准库的介绍,比如日期时间API、正则表达式、Swing/...
《JVM和GC详解及调优》是一本深入解析Java虚拟机(JVM)和垃圾收集(Garbage Collection,简称GC)的专业书籍,对于Java开发者来说,是进阶提升的必备资料。书中详尽地阐述了JVM的工作原理,以及如何进行有效的性能...
4. **JVM调优**:包括堆大小设置、新生代与老年代比例、GC算法选择等。通过调整这些参数,可以优化应用的启动速度、响应时间和内存使用。 5. **性能监控与分析**:使用JDK自带的JConsole、VisualVM等工具,或者第三...
JVM是Java的核心组成部分,它负责解析并执行Java字节码,为Java程序提供了一个运行环境。JVM通过类装载器、执行引擎、内存管理、本地方法接口等功能,实现了对Java程序的高效运行。 2. 线程 在Java中,线程是程序...
这份"Java面经-百度准入职老哥整理(八股文)"是针对Java程序员入职百度所整理的一份宝贵的参考资料,它涵盖了面试中常被问到的Java基础、进阶以及与百度实际业务相关的技术知识点。以下将对这些知识点进行详细阐述。 ...
### Java进阶路线详解 #### 一、Java基础 **1. 传值与传引用** 在Java中,基本类型(如int、char等)的传递是按值传递的,而对象类型的传递则是按引用传递的。理解这一点对于正确处理变量和对象之间的交互至关...
了解JVM内存模型(包括堆、栈、方法区、本地方法栈和程序计数器),熟悉垃圾收集机制(如新生代、老年代、Minor GC和Full GC),以及如何进行性能调优(比如通过JVM参数调整内存大小、开启GC日志等)。 2. **数据...
### JVM调优总结:Xms、Xmx、Xmn、Xss 在Java虚拟机(JVM)的运行过程中,合理的参数配置对于提高程序性能至关重要。本文将对JVM调优中的几个关键参数进行深入解析,包括-Xms、-Xmx、-Xmn和-Xss等,帮助开发者更好...
**Java-Guide:Java核心知识笔记** 这是一份详尽的Java学习资源,旨在帮助Java开发者巩固和深化其核心知识。这份笔记包含了从基础到高级的各类Java编程概念,是学习和进阶Java技术的宝贵资料。Markdown格式使得内容...
在Java进阶学习中,我们会深入探讨以下几个关键领域: 1. 高级数据结构与算法:理解并掌握Java中的ArrayList、LinkedList、HashMap等集合框架的实现原理和性能特性,以及如何有效地运用它们来解决复杂问题。同时,...
Java核心技术是Java编程领域的一本经典著作,涵盖了Java语言的基础以及高级特性,是广大Java开发者必备的参考书籍。本PDF版本为《Java核心技术 卷1》,主要关注Java的基础知识,适合初学者和有一定经验的开发者深入...
### Java-面试题合集:基础与进阶 #### JVM的最佳配置详解 1. **-Xms 和 -Xmx 的一致性设置**: - **-Xms**:指定了JVM启动时分配的初始堆内存大小。 - **-Xmx**:定义了JVM在运行过程中能够使用的最大堆内存...
### Java开发进阶知识点概述 #### 一、多线程深入理解 在Java开发中,多线程技术是一项非常重要的技能。它可以帮助开发者构建出高效、响应迅速的应用程序。接下来,我们将详细介绍多线程的基本概念及其高级应用。 ...
为了在Java领域进一步提升,了解和掌握Java进阶的核心知识至关重要。本文将深入探讨JVM(Java虚拟机),这是Java程序运行的基础,也是面试中经常考察的重点。 **JVM(Java虚拟机)** JVM是Java平台的核心组成部分...
### Java语言程序设计进阶知识点解析 #### 一、Java语言概述 - **定义与特点**:Java是一种广泛使用的高级编程语言,由Sun Microsystems在1995年首次发布。它具有面向对象、平台无关性、健壮性、安全性等特点。 - ...
1. **第28讲 - GC调优**:在Java中,垃圾收集(Garbage Collection, GC)是自动内存管理的关键部分。本讲可能详细解析了GC的工作原理,包括不同的GC算法如串行、并行、并发和G1等,以及如何通过调整JVM参数进行性能...
第一周:JVM 进阶: 1.JVM 基础知识 2.Java 字节码技术 3.JVM 类加载器 4.JVM 内存模型 5.JVM 启动参数 6.JDK 内置命令行工具 7.JDK 内置图形化工具 8.GC 的背景与一般原理 9.串行 GC&并行 GC 10.CMS GC 11.G1 GC 12...
这份文档详细涵盖了Java编程语言的各个方面,包括基础概念、进阶特性、并发处理、内存管理、垃圾收集、集合框架、IO流、网络编程、设计模式以及框架应用等核心知识点。以下是对这些关键领域的详细阐述: 1. **Java...
二、Java进阶 1. 集合框架:深入学习List、Set、Map接口及其实现类,理解它们的区别和应用场景。 2. 多线程:掌握并发编程,理解线程状态,熟悉synchronized、volatile、ThreadLocal等关键字。 3. 文件与I/O流:学习...
- **垃圾回收机制**:GC算法(如标记-清除、复制、标记-整理、分代收集),GC调优。 - **内存泄漏与内存溢出**:识别和解决方法。 5. **Java泛型**: - 泛型的基本概念,类型擦除,通配符使用。 - 泛型方法与...