JVM常用调优工具介绍
前言
王子在之前的JVM文章中已经大体上把一些原理性问题说清楚了,今天主要是介绍一些实际进行JVM调优工作的工具和命令,不会深入讲解,因为网上资料很多,篇幅可能不长,但都是实用的内容,小伙伴们有不清楚的可以自行查找资料。
jstat命令
jstat命令可以查看到很多的jvm信息,详细内容可以自行百度,本篇只介绍我们经常使用的命令。
jstat -gc PID 1000 10
一般最常用的命令就是这个了,它的意思是每1秒打印一次jvm的内存信息,打印10次。
通过此命令可以分析出新生代对象的增长速度,Young GC的触发频率和耗时、老年代的增长速度、Full GC的触发频率和耗时。
分析之后进行合理的jvm参数设置进行调优工作。
里面的各个参数解释如下:
- S0C:第一个幸存区的大小
- S1C:第二个幸存区的大小
- S0U:第一个幸存区的使用大小
- S1U:第二个幸存区的使用大小
- EC:伊甸园区的大小
- EU:伊甸园区的使用大小
- OC:老年代大小
- OU:老年代使用大小
- MC:方法区大小
- MU:方法区使用大小
- CCSC:压缩类空间大小
- CCSU:压缩类空间使用大小
- YGC:年轻代垃圾回收次数
- YGCT:年轻代垃圾回收消耗时间
- FGC:老年代垃圾回收次数
- FGCT:老年代垃圾回收消耗时间
- GCT:垃圾回收消耗总时间
PID可以通过jps命令获得,jps就是一个查看java进程的命令,没什么可说的,不清楚的小伙伴百度了解下即可。
jmap和jhat命令
jmap -dump:live,format=b,file=dump.hprof PID
生成内存快照,以供分析内存占用情况。
jhat dump.hprof
分析内存快照,内置了web容器,可以通过浏览器分析堆内存快照。
MAT工具
功能比较强大的内存分析工具,可以替代jhat。
需要注意的一点是,线上导出来的dump如果很大的话,比如有几个GB,使用MAT之前需要修改MemoryAnalyzer.ini文件,修改堆内存的大小足够容纳你的dump文件
常用的监控系统
一般我们可以配置一套自动化监控系统,如果发现JVM出现异常,可以报警,比如发送短信或邮件给负责人。
常用的有Zabbix,Ganglla,Open-Falcon,Prometheus。
如果想要引入一套监控系统,可以自行了解以上监控系统,在其中选择一个。
一套JVM调优的参数模板
以下是王子在jvm调优工作中总结的常用调优参数,在这里分享给小伙伴们,一般合理的配置以下参数就可以获得一个比较好的性能
| -Xms2048m | 初始堆大小 |
| -Xmx2048m | 最大堆大小 |
| -Xmn1024m | 年轻代大小 |
| -XX:PermSize=256m | 设置持久代(perm gen)初始值(JDK8以后弃用改为-XX:MetaspaceSize) |
| -XX:MaxPermSize=256m | 设置持久代最大值(JDK8以后弃用改为-XX:MaxMetaspaceSize) |
| -Xss1m | 每个线程的堆栈大小(等价于-XX:ThreadStackSize) |
| -XX:SurvivorRatio | Eden区与Survivor区的大小比值(默认为8) |
| -XX:+DisableExplicitGC | 关闭System.gc(),如果系统中使用了nio调用堆外内存,慎用此参数 |
| -XX:MaxTenuringThreshold=15 | 年轻代垃圾回收最大年龄,默认15,15次后进入老年代 |
| -XX:PretenureSizeThreshold | 对象超过多大直接在老年代分配 |
| -XX:+UseParNewGC | 使用ParNewGC垃圾回收器 |
| -XX:+UseConcMarkSweepGC | 使用CMS内存收集 |
| -XX:CMSInitiatingOccupancyFraction=92 | CMS垃圾收集器,当老年代达到92%时,触发CMS垃圾回收 |
| -XX:CMSFullGCsBeforeCompaction=0 | 多少次后进行内存压缩,默认0 |
|
-XX:+CMSScavengeBeforeRemark |
CMS重新标记之前尽量进行一次Young GC |
| -XX:+UseCMSCompactAtFullCollection | 在FULL GC的时候, 对老年代的压缩,默认打开 |
| -XX:+CMSParallelInitialMarkEnabled | CMS初始标记并行化,增加初始标记速度 |
| -Xverify:no | 禁止字节码校验,提高编译速度(jdk13之后作废,生产环境不使用) |
| -XX:+UseG1GC | 使用G1垃圾回收器 |
| -XX:MaxGCPauseMillis=200 | 目标GC暂停时间,尽可能目标 |
|
-XX:+PrintGCTimeStamps |
合并使用,打印GC信息到指定文件 |
|
-XX:+HeapDumpOnOutOfMemoryError |
表示当JVM发生OOM时,自动生成DUMP文件 |
|
-XX:HeapDumpPath=${目录} |
表示生成DUMP文件的路径,也可以指定文件名称,例如:-XX:HeapDumpPath=${目录}/java_heapdump.hprof。如果不指定文件名,默认为:java_<pid>_<date>_<time>_heapDump.hprof |
总结
到这里本篇文章就结束了,关于JVM部分的文章可能暂时也结束了,下边的话是一些经验之谈。
如何具体的做好JVM调优不是简简单单的一篇文章就能说得清的,不要相信什么网上的万能jvm调优模板,王子提供的模板也只是常用的一些调优参数,一切的调优都需要通过分析实际生产环境情况后,才能做出最适合生产环境的调优方案,真正能证明你价值的地方就在于你的分析并处理问题的能力,而不是说你懂了JVM的原理就可以了,JVM原理只是基础,能把它实际运用才能称它为价值!
如果想成为一个JAVA高级工程师甚至架构师,JVM调优是必备技能之一,需要小伙伴们经过大量真实的调优工作后才会有所心得,这个就要靠大家自己去实践了。
如果有小伙伴感兴趣,王子可以接着写一些实践场景的文章,这个是后话了。
本文主要是提供了一些工具和命令的介绍,并提供了常用的JVM调优参数,它们是你实践的开始。
也欢迎小伙伴们留言说出你的想法。
往期文章推荐:

JVM常用调优工具介绍的更多相关文章
- Android系统性能调优工具介绍
http://blog.csdn.net/innost/article/details/9008691 经作者授权,发表Tieto某青年牛的一篇<程序员>大作. Android系统性能调优 ...
- 【十一】jvm 性能调优工具之 jmap
jvm 性能调优工具之 jmap 概述 命令jmap是一个多功能的命令.它可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息.查看 ClassLoader 的信息以及 fi ...
- jvm 性能调优工具之 jps 命令详解
JPS名称:jps - Java Virtual Machine Process Status Tool命令用法:jps [options] [hostid] options:命令选项,用来对输出格式 ...
- Linux性能分析调优工具介绍
1.常用性能分析工具 1)CPU性能分析工具 vmstat ps sar time strace pstree top 2)Memory性能分析工具 vmstat strace top ipcs ip ...
- JVM 性能调优工具
jdk自带的工具,在macOs系统中的目录位置(jdk具体版本位置要替换):/Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Ho ...
- 【十三】jvm 性能调优工具之 jstack
一.介绍 jstack是java虚拟机自带的一种堆栈跟踪工具.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项&qu ...
- jvm 性能调优工具之 jmap 命令详解
jmap名称:Java Memory Map(内存映射) 官方文档:https://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jmap.html ...
- 【十二】jvm 性能调优工具之 jhat (JVM Heap Analysis Tool)
jhat也是jdk内置的工具之一.主要是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言. jhat 非常耗费cpu和内存,所以一般不使 ...
- jvm 性能调优工具之 jstat
概述 Jstat是JDK自带的一个轻量级小工具.全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建 ...
随机推荐
- 网站搭建-云服务器ECS-镜像管理
学习笔记: 快照,系统盘可创建镜像,数据盘不可以. 实例可以直接创建镜像,包括系统盘和数据盘 复制镜像: 新购服务器,选择镜像(又买). 共享镜像: 账号ID就是UID 云市场获取镜像; 1. 创建新 ...
- win7如何安装maven
1.Maven的简介Maven是一个项目管理工具,主要用于Java平台的项目构建.依赖管理和项目生命周期管理. 当然对于我这样的程序猿来说,最大的好处就是对jar包的管理比较方便,只需要告诉Maven ...
- GC调优-XX:PrintGCDetails深度解析
查看程序运行GC的运行情况 资源充足的GC情况 新生代 老年代 元空间 因为现在资源充足没有发生GC *案例:将JVM初始化内存与最大内存(防止内存抖动,反复GC)调至10m,new一个50m的数组对 ...
- Docker(Docker Toolbox)配置镜像加速更换国内源
自己当时装的是Win10专业工作室版本,不知道为什么不支持window for docker, 所以选择了Docker Toolbox 的方式,主要是为了学习,虽然这种方式是不建议安装的,但是基础的学 ...
- day36 Pyhton 网络编程03
一.内容回顾 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. sock ...
- SpringBoot整合Elasticsearch游标查询(scroll)
游标查询(scroll)简介 scroll 查询 可以用来对 Elasticsearch 有效地执行大批量的文档查询,而又不用付出深度分页那种代价. 游标查询会取某个时间点的快照数据. 查询初始化之后 ...
- zabbix:以主动模式添加一台受监控主机 (zabbix5.0)
一,zabbix被动模式和主动模式的区别? zabbix-agent默认的模式是被动模式, zabbix agent被动地接受zabbix server发来的指令, 获取数据后再返回给zabbix s ...
- C#中string类的几个方法(indexof、lastindexof、substring)(转)
String.IndexOf String.IndexOf 方法 (Char, Int32, Int32) 报告指定字符在此实例中的第一个匹配项的索引.搜索从指定字符位置开始,并检查指定数量的字符位置 ...
- 在centos下启动nginx出现Failed to start nginx.service:unit not found
错误的原因就是没有添加nginx服务,所以启动失败. 解决方法: 1. 在/root/etc/init.d/目录下新建文件,文件名为nginx 或者用命令在根目录下执行:# vim /etc/i ...
- spring与struts2整合出现错误HTTP Status 500 - Unable to instantiate Action
在进行spring和struts2整合的时候因为大意遇到了一个问题,费了半天神终于找到了问题所在,故分享出来望广大博友引以为戒!! 我们都知道在spring和struts2整合时,spring接管了a ...