1、通俗易懂,适合小白
2、仅做面试复习用,部分来源网络,博文免费,知识无价,侵权请联系!
前言
JVM 调优参数是调整 Java 应用程序性能的关键工具。通过合理设置这些参数,可以优化内存使用、垃圾回收行为以及应用程序的响应时间。下面我们用通俗易懂的例子和图示来解释常见的 JVM 调优参数。
1. 堆内存调优参数
堆内存是 JVM 中最重要的部分,存储所有对象实例。调优堆内存可以避免内存溢出(OOM)和频繁的垃圾回收。
1.1 -Xms 和 -Xmx
- 作用:设置堆的初始大小和最大大小。
- 示例:
-Xms512m -Xmx2048m
-Xms512m
:堆初始大小为 512MB。-Xmx2048m
:堆最大大小为 2048MB。
- 比喻:
- 堆就像一个仓库,
-Xms
是仓库的初始容量,-Xmx
是仓库的最大容量。 - 如果仓库初始容量太小,可能需要频繁扩容(影响性能);如果最大容量太小,仓库可能会爆满(OOM)。
- 堆就像一个仓库,
- 图示:
[堆内存] +-------------------+ | 初始大小:512MB | | 最大大小:2048MB | +-------------------+
1.2 -Xmn
- 作用:设置新生代的大小。
- 示例:
-Xmn256m
- 新生代大小为 256MB。
- 比喻:
- 新生代就像工厂的“临时仓库”,存放新生产的玩具(新对象)。
- 如果临时仓库太小,新玩具可能很快堆满,导致频繁清理(Minor GC)。
- 图示:
[新生代] +-------------------+ | 大小:256MB | +-------------------+
1.3 -XX:NewRatio
-
作用:设置老年代与新生代内存比例。
-
格式:
-XX:NewRatio=<value>
<value>
是一个整数,表示老年代与新生代的比例。- 默认值:
-XX:NewRatio=2
(即老年代是新生代的 2 倍)。
-
示例 1:
-XX:NewRatio=2
- 表示老年代与新生代的比例为 2:1。
- 如果堆总大小为 1200MB,则:
- 老年代 = 800MB
- 新生代 = 400MB
1.4 -XX:SurvivorRatio
-
作用:设置 Eden 区与单个 Survivor 区的比例。
-
格式:
-XX:SurvivorRatio=<value>
<value>
是一个整数,表示 Eden 区与单个 Survivor 区的比例。- 默认值:
-XX:SurvivorRatio=8
(即 Eden 区是单个 Survivor 区的 8 倍)。
2. 垃圾回收调优参数
垃圾回收是 JVM 性能的关键,调优 GC 可以减少停顿时间(STW)和提高吞吐量。
2.1 -XX:+UseG1GC
- 作用:启用 G1 垃圾回收器。
- 示例:
-XX:+UseG1GC
- 比喻:
- G1 就像一个高效的清洁工,把仓库分成多个小区域(Region),每次只清理一部分,减少停工时间。
- 图示:
[G1 垃圾回收器] +-------------------+ | 分 Region 清理 | +-------------------+
2.2 -XX:MaxGCPauseMillis
- 作用:设置最大 GC 停顿时间目标。
- 示例:
-XX:MaxGCPauseMillis=200
- 最大停顿时间为 200 毫秒。
- 比喻:
- 清洁工每次清理的时间不能超过 200 毫秒,否则会影响工厂的生产效率。
- 图示:
[GC 停顿时间] +-------------------+ | 目标:≤ 200ms | +-------------------+
2.3 -XX:ParallelGCThreads
- 作用:设置并行 GC 的线程数。
- 示例:
-XX:ParallelGCThreads=4
- 使用 4 个线程进行并行 GC。
- 比喻:
- 清洁工团队有 4 个人,可以同时清理多个区域,提高效率。
- 图示:
[并行 GC 线程] +-------------------+ | 线程数:4 | +-------------------+
3. 方法区调优参数
方法区存储类元数据和常量池,调优方法区可以避免 OutOfMemoryError
。
3.1 -XX:MetaspaceSize 和 -XX:MaxMetaspaceSize
- 作用:设置元空间的初始大小和最大大小。
- 示例:
-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m
- 元空间初始大小为 128MB,最大大小为 512MB。
- 比喻:
- 元空间就像工厂的“设计图纸库”,存放所有产品的设计信息。
- 如果图纸库太小,可能装不下所有设计图;如果太大,会浪费空间。
- 图示:
[元空间] +-------------------+ | 初始大小:128MB | | 最大大小:512MB | +-------------------+
4. 栈调优参数
栈存储方法调用的栈帧,调优栈可以避免 StackOverflowError
。
4.1 -Xss
- 作用:设置每个线程的栈大小。
- 示例:
-Xss1m
- 每个线程的栈大小为 1MB。
- 比喻:
- 每个工人的流水线(栈)长度为 1MB,如果流水线太短,工人可能无法完成任务(栈溢出)。
- 图示:
[线程栈] +-------------------+ | 大小:1MB | +-------------------+
5. 其他常用参数
5.1 -XX:+HeapDumpOnOutOfMemoryError
- 作用:在发生 OOM 时生成堆转储文件。
- 示例:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump
- 比喻:
- 如果仓库爆满(OOM),自动拍一张照片(堆转储文件)以便后续分析。
- 图示:
[堆转储文件] +-------------------+ | 路径:/path/to/dump| +-------------------+
5.2 -XX:+PrintGCDetails
- 作用:打印详细的 GC 日志。
- 示例:
-XX:+PrintGCDetails
- 比喻:
- 清洁工每次清理后,记录清理的详细情况(GC 日志)。
- 图示:
[GC 日志] +-------------------+ | 详细记录 GC 信息 | +-------------------+
图示总结
+-----------------------------+
| JVM 调优参数 |
| |
| +-----------------------+ |
| | 堆内存调优 | |
| | -Xms512m -Xmx2048m | |
| | -Xmn256m | |
| +-----------------------+ |
| |
| +-----------------------+ |
| | 垃圾回收调优 | |
| | -XX:+UseG1GC | |
| | -XX:MaxGCPauseMillis | |
| | -XX:ParallelGCThreads| |
| +-----------------------+ |
| |
| +-----------------------+ |
| | 方法区调优 | |
| | -XX:MetaspaceSize | |
| | -XX:MaxMetaspaceSize | |
| +-----------------------+ |
| |
| +-----------------------+ |
| | 栈调优 | |
| | -Xss1m | |
| +-----------------------+ |
| |
| +-----------------------+ |
| | 其他参数 | |
| | -XX:+HeapDumpOnOOM | |
| | -XX:+PrintGCDetails | |
| +-----------------------+ |
+-----------------------------+
通俗易懂的例子
假设你是一个工厂老板,工厂的任务是生产玩具:
- 堆内存调优:
- 设置仓库的初始容量(
-Xms
)和最大容量(-Xmx
),避免仓库爆满或频繁扩容。 - 设置临时仓库的大小(
-Xmn
),确保新生产的玩具有足够的存放空间。
- 设置仓库的初始容量(
- 垃圾回收调优:
- 选择高效的清洁工(G1),并限制每次清理的时间(
-XX:MaxGCPauseMillis
)。 - 增加清洁工团队的人数(
-XX:ParallelGCThreads
),提高清理效率。
- 选择高效的清洁工(G1),并限制每次清理的时间(
- 方法区调优:
- 设置设计图纸库的大小(
-XX:MetaspaceSize
),确保所有设计图都能存放。
- 设置设计图纸库的大小(
- 栈调优:
- 设置每个工人的流水线长度(
-Xss
),确保工人能完成任务。
- 设置每个工人的流水线长度(
- 其他参数:
- 如果仓库爆满,自动拍照(
-XX:+HeapDumpOnOutOfMemoryError
)以便分析问题。 - 记录清洁工的每次清理情况(
-XX:+PrintGCDetails
),方便优化流程。
- 如果仓库爆满,自动拍照(
**:
- 设置设计图纸库的大小(
-XX:MetaspaceSize
),确保所有设计图都能存放。
- 栈调优:
- 设置每个工人的流水线长度(
-Xss
),确保工人能完成任务。
- 设置每个工人的流水线长度(
- 其他参数:
- 如果仓库爆满,自动拍照(
-XX:+HeapDumpOnOutOfMemoryError
)以便分析问题。 - 记录清洁工的每次清理情况(
-XX:+PrintGCDetails
),方便优化流程。
- 如果仓库爆满,自动拍照(
通过这个比喻,JVM 调优参数的作用和设置方法就一目了然了!