JVM调优篇-010

举报
kwan的解忧杂货铺 发表于 2024/08/29 20:08:04 2024/08/29
【摘要】 1.堆参数–Xms:JVM 初始分配的堆内存,默认是物理内存的 1/64–Xmx:JVM 最大允许分配的堆内存,默认是物理内存的 1/4建议将 Xms 和 Xmx 设为一样的值,避免每次垃圾回收完成后 JVM 重新分配内存。如果虚拟机启动时设置的 Xms 比较小,这个时候又需要初始化很多对象,虚拟机会不断地增加内存。#设置堆的初始和最大都为1M-Xms1024m -Xmx1024m#设置堆...

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 毫秒的情况可能是正常的,也可能是不正常的,具体取决于你的应用程序的性质、内存配置和工作负载。以下是分析和处理这种情况的一般步骤:

  1. 了解应用程序性质:首先,你需要了解你的应用程序的性质。年轻代垃圾收集通常是正常的,因为它负责回收短暂存在的对象。频繁的 Young GC 可能是应用程序中大量对象的短暂生命周期导致的,这通常是正常的情况。

  2. 检查内存配置:确保你的堆内存大小和分代比例设置合理。如果年轻代过小,可能会导致频繁的 Young GC。你可以使用 JVM 参数来调整堆内存大小,例如 -Xmx-Xms 来设置最大堆和初始堆大小,以及 -XX:NewRatio 来设置年轻代与老年代的比例。

  3. 分析 GC 日志:查看 GC 日志以获取有关 Young GC 的详细信息。了解每次 Young GC 的频率、持续时间、回收的对象数量等信息。如果 Young GC 的频率较高,但每次 GC 的时间都很短,则可能是正常的。

  4. 考虑内存泄漏:如果频繁的 Young GC 持续存在,可能是因为存在内存泄漏问题,导致对象无法被回收。在这种情况下,你可以使用内存分析工具(如 Eclipse MAT、VisualVM、YourKit 等)来检测和解决内存泄漏。

  5. 性能测试和优化:如果频繁的 Young GC 影响了应用程序的性能,可以考虑进一步的性能测试和优化。优化措施可能包括减少对象的创建、调整垃圾收集器的类型、调整应用程序的算法等。

  6. 监控和警报:建议设置监控和警报系统,以便在垃圾回收活动异常时及时发出警报。这样可以帮助你在问题发生时迅速采取行动。

Young GC 频繁并不一定是不正常的,但需要结合应用程序的性质和工作负载来评估。如果频繁的 Young GC 影响了应用程序的性能或持续时间很长,那么可能需要进一步的调查和优化。分析 GC 日志和使用监控工具可以帮助你更好地理解和管理垃圾收集行为。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。