JVM调优篇-010
1.堆参数
- –Xms:JVM 初始分配的堆内存,默认是物理内存的 1/64
- –Xmx:JVM 最大允许分配的堆内存,默认是物理内存的 1/4
建议将 Xms 和 Xmx 设为一样的值,避免每次垃圾回收完成后 JVM 重新分配内存。如果虚拟机启动时设置的 Xms 比较小,这个时候又需要初始化很多对象,虚拟机会不断地增加内存。
#设置堆的初始和最大都为1M
-Xms1024m -Xmx1024m
#设置堆的初始和最大都为3g
-Xms3g -Xmx3g
2.JVM 参数
所谓 JVM 调优就是设置一个合理的 JVM 参数,适合当前系统运行。
JVM 参数分为三类:
- 标准参数
- -X 参数
- -XX 参数
3.标准参数
以"-"开头的参数称为标准参数,是任何一个 JDK 版本都支持的,比较稳定,不会随 jdk 版本更新和改变。例如-version,-help,-server。
4.-X 参数
以-X 开头的参数是在特定版本 HotSpot 支持的命令,jdk 版本变化之后,参数可能变化,这个参数用的较少。
5.-XX 参数
-XX 是不稳定的参数,也是主要参数,分为 Boolean 类型和非 Boolean 类型。
Boolean 型
Boolean 型的-XX 参数使用格式为:
#语法
-XX:[+-]<name>
例如:
#表示启用CMS垃圾收集器
-XX:+UseConcMarkSweepGC
#表示启用G1垃圾收集器
-XX:+UseG1GC
#表示打印出所有的JVM参数信息
-XX:+PrintFlagsFinal
非 Boolean 型
非 Boolean 型的-XX 参数的使用格式为:
#name表示属性,value表示属性对应的值
-XX:<name>=<value>
例如:
#设置最大永久代空间大小为5M
-XX:MaxMetaspaceSize=5M
6.堆栈参数
还有一些非常有用的参数,比如-Xms,-Xmx,-Xss,实际上这几种参数也是属于-XX 参数,只是简写了。
#堆最大为1000M设置方式
-Xms1000M
-XX:InitialHeapSize=1000M
#堆初始
-Xmx1000M
-XX:MaxHeapSize=1000M
#栈最大
-Xss1000M
-XX:ThreadStackSize=1000M
7.常用 JVM 参数
设置 | 说明 |
---|---|
-XX:ClCompilerCount=3 | 最大并行编译数,大于 1 时可以提高编译速度,但会影响系统稳定性 |
-XX:InitialHeapSize=100m | 初始堆大小,可以简写为-Xms100 |
-XX:MaxHeapSize | 最大堆大小,可以简写为-Xmx100 |
-XX:NewSize=20m | 设置年轻代大小 |
-XX:MaxNewSize | 设置年轻代最大值 |
-XX:OldSize=50m | 设置老年代大小 |
-XX:MetaspaceSize=50m | 设置方法区大小,jdk1.8 才有,用元空间代替方法区 |
-XX:+UseParallelGC | 设置 Parallel Scanvage 作为新生代收集器,系统默认会选择 Parallel Old 作为老年代收集器 |
-XX:NewRatio | 新生代和老年代的比值,比如 -XX:NewRatio=4 表示新生代:老年代=1:4 |
-XX:SurvivorRatio | 表示两个 S 区和 Eden 区的比值,比如-XX:SurvivorRatio=8 表示(S0+S1):Eden=2:8 |
8.如何查看 GC 日志?
查看 JVM 的垃圾回收(GC)日志并通过日志来评估 GC 是否正常运行是诊断和优化 Java 应用程序性能的重要步骤之一。以下是如何查看 GC 日志并分析它的一般步骤:
启用 GC 日志:
在运行 Java 应用程序时,可以通过以下 JVM 参数来启用 GC 日志:
-XX:+PrintGCDetails
:打印详细的 GC 信息。-XX:+PrintGCDateStamps
:在日志中打印 GC 发生的日期和时间。-Xloggc:<path-to-logfile>
:将 GC 日志输出到指定文件中,例如-Xloggc:/path/to/gc.log
。
例如,你可以在启动应用程序时使用以下命令启用 GC 日志:
java -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/to/gc.log -jar YourApp.jar
收集 GC 日志:
让应用程序运行一段时间,以便 GC 日志记录了足够的信息。
9.GC 日志分析
查看 GC 日志:
打开 GC 日志文件(例如 /path/to/gc.log
)并查看其中的内容。GC 日志通常包含有关 GC 活动的详细信息,包括 GC 类型、发生时间、持续时间、回收的对象数量等。
样例 GC 日志行:
2023-09-05T10:30:15.123-0400: [GC (Allocation Failure) 2023-09-05T10:30:15.123-0400: [ParNew: 5120K->512K(5632K), 0.0012619 secs] 8192K->8192K(19456K), 0.0013687 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
在这个示例中,可以看到一次新生代(ParNew)GC,它告诉我们发生的时间、GC 类型、持续时间以及内存使用情况。
分析 GC 日志:
通过查看 GC 日志,你可以分析以下关键信息:
- GC 的类型(新生代、老年代、Full GC 等)。
- GC 的频率和持续时间。
- 内存使用情况,包括堆内存和非堆内存的使用情况。
- 内存回收的效率,例如对象回收的百分比。
通过分析这些信息,你可以判断 GC 是否正常运行。常见的问题包括频繁的 Full GC、长时间的停顿、内存泄漏等。如果发现异常,可以进一步采取措施来调整堆大小、GC 策略等以优化应用程序性能。
使用工具:
除了手动分析 GC 日志,还可以使用工具如 VisualVM、GCMV、GCViewer 、GCEasy 等来可视化和分析 GC 日志,这些工具可以更方便地查看 GC 行为和性能指标。
10.Young GC 频繁?
Young GC(年轻代垃圾收集)频繁且每次只占用 10 毫秒的情况可能是正常的,也可能是不正常的,具体取决于你的应用程序的性质、内存配置和工作负载。以下是分析和处理这种情况的一般步骤:
-
了解应用程序性质:首先,你需要了解你的应用程序的性质。年轻代垃圾收集通常是正常的,因为它负责回收短暂存在的对象。频繁的 Young GC 可能是应用程序中大量对象的短暂生命周期导致的,这通常是正常的情况。
-
检查内存配置:确保你的堆内存大小和分代比例设置合理。如果年轻代过小,可能会导致频繁的 Young GC。你可以使用 JVM 参数来调整堆内存大小,例如
-Xmx
和-Xms
来设置最大堆和初始堆大小,以及-XX:NewRatio
来设置年轻代与老年代的比例。 -
分析 GC 日志:查看 GC 日志以获取有关 Young GC 的详细信息。了解每次 Young GC 的频率、持续时间、回收的对象数量等信息。如果 Young GC 的频率较高,但每次 GC 的时间都很短,则可能是正常的。
-
考虑内存泄漏:如果频繁的 Young GC
持续存在
,可能是因为存在内存泄漏问题,导致对象无法被回收。在这种情况下,你可以使用内存分析工具(如 Eclipse MAT、VisualVM、YourKit 等)来检测和解决内存泄漏。 -
性能测试和优化:如果频繁的 Young GC 影响了应用程序的性能,可以考虑进一步的
性能测试和优化
。优化措施可能包括减少对象的创建、调整垃圾收集器的类型、调整应用程序的算法等。 -
监控和警报:建议设置监控和警报系统,以便在垃圾回收活动异常时及时发出警报。这样可以帮助你在问题发生时迅速采取行动。
Young GC 频繁并不一定是不正常的,但需要结合应用程序的性质和工作负载来评估。如果频繁的 Young GC 影响了应用程序的性能或持续时间很长,那么可能需要进一步的调查和优化。分析 GC 日志和使用监控工具可以帮助你更好地理解和管理垃圾收集行为。
- 点赞
- 收藏
- 关注作者
评论(0)