JVM调优(内存、GC、JVM参数)

内存调优

常用监控工具
Top命令

top命令是linux下用来查看系统信息的一个命令,它提供给我们去实时地去查看系统的资源,比如执行时的进程、线程和系统参数等信息。进程使用的内存为RES(常驻内存)- SHR(共享内存)

VisualVM

VisualVM是多功能合一的Java故障排除工具并且他是一款可视化工具,整合了命令行 JDK 工具和轻量级分析功能。

内存快照

当堆内存溢出时,需要在堆内存溢出时将整个堆内存保存下来,生成内存快照(Heap Profile )文件。

使用MAT打开hprof文件,并选择内存泄漏检测功能,MAT会自行根据内存快照中保存的数据分析内存泄漏的根源。

生成内存快照的Java虚拟机参数:

-XX:+HeapDumpOnOutOfMemoryError:发生OutOfMemoryError错误时,自动生成hprof内存快照文件。

-XX:HeapDumpPath=<path>:指定hprof文件的输出路径。

使用MAT打开hprof文件,并选择内存泄漏检测功能,MAT会自行根据内存快照中保存的数据分析内存泄漏的根源。

导出运行中系统的内存快照,比较简单的方式有两种,注意只需要导出标记为存活的对象:

通过JDK自带的jmap命令导出,格式为:

jmap -dump:live,format=b,file=文件路径和文件名 进程ID

通过arthas的heapdump命令导出,格式为:

heapdump --live 文件路径和文件名

GC调优

jstat工具

Jstat工具是JDK自带的一款监控工具,可以提供各种垃圾回收、类加载、编译信息

等不同的数据。使用方法为:jstat -gc 进程ID 每次统计的间隔(毫秒) 统计次数

C代表Capacity容量,U代表Used使用量

S -- 幸存者区,E -- 伊甸园区,O -- 老年代,M -- 元空间

YGC、YGT:年轻代GC次数和GC耗时(单位:秒)

FGC、FGCT:Full GC次数和Full GC耗时

GCT:GC总耗时

GC日志

通过GC日志,可以更好的看到垃圾回收细节上的数据,同时也可以根据每款垃圾回收器的不同特点更好地发现存在的问题。

使用方法(JDK 8及以下):-XX:+PrintGCDetails -Xloggc:文件名

使用方法(JDK 9+):-Xlog:gc*:file=文件名

分析GC日志
GCViewer

GCViewer是一个将GC日志转换成可视化图表的小工具,github地址: https://github.com/chewiebug/GCViewer 使用方法:java -jar gcviewer_1.3.4.jar 日志文件.log

GCEasy

GCeasy是业界首款使用AI机器学习技术在线进行GC分析和诊断的工具。定位内存泄漏、GC延迟高的问题,提供JVM参数优化建议,支持在线的可视化工具图表展示。 官方网站:https://gceasy.io/

优化基础JVM参数

-Xms1g 设置的是最大堆内存

-Xmx1g 设置初始堆大小,建议将-Xms设置的和-Xmx一样大

-Xss256k 虚拟机栈大小,合理值为256k -- 1m之间。

-XX:MaxMetaspaceSize=512m 最大元空间大小,默认值比较大,如果出现元空间内存泄漏会让操作系统可用内存不可控,建议根据测试情况设置最大值,一般设置为256m

-XX:MetaspaceSize 参数指的是到达这个值之后会触发FULLGC,后续什么时候再触发JVM会自行计算。如果设置为和MaxMetaspaceSize一样大,就不会FULLGC,但是对象也无法回收。(一般不手动设置)

-XX:+DisableExplicitGC 禁止在代码中使用System.gc()

-XX:+HeapDumpOnOutOfMemoryError 发生OutOfMemoryError错误时,自动生成hprof内存快照文件。

-XX:HeapDumpPath=/opt/logs/my-service.hprof 指定hprof文件的输出路径。

打印GC日志

JDK8及之前 : -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:文件路径

JDK9及之后 : -Xlog:gc*:file=文件路径

相关推荐
Derek_Smart2 天前
从一次 OOM 事故说起:打造生产级的 JVM 健康检查组件
java·jvm·spring boot
大道至简Edward2 天前
深入 JVM 核心:一文读懂 Class 文件结构(附 Hex 实战解析)
jvm
weisian1516 天前
JVM--20-面试题6:如何判断对象可以被垃圾回收?
jvm·可达性算法
蚊子码农6 天前
每日一题--JVM线程分析与死锁排查
jvm
xuxie996 天前
NEXT 1 进程2
java·开发语言·jvm
weisian1516 天前
JVM--19-面试题5:说说JVM的类加载机制和双亲委派模型
jvm·双亲委派模型·jvm类加载机制
亓才孓6 天前
【反射机制】
java·javascript·jvm
Volunteer Technology6 天前
JVM之性能优化
jvm·python·性能优化
Andy Dennis6 天前
Java语法注意事项
java·开发语言·jvm
坚持的小马6 天前
JVM相关笔记-jps
jvm·笔记