前言

王子在之前的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
-XX:+PrintGCDetails
-Xloggc:d:\idea_gc.log

合并使用,打印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的类加载机制

JVM内存模型不再是秘密

轻松理解JVM的分代模型

秒懂JVM的垃圾回收机制

探索ParNew和CMS垃圾回收器

探索G1垃圾回收器

JVM常用调优工具介绍的更多相关文章

  1. Android系统性能调优工具介绍

    http://blog.csdn.net/innost/article/details/9008691 经作者授权,发表Tieto某青年牛的一篇<程序员>大作. Android系统性能调优 ...

  2. 【十一】jvm 性能调优工具之 jmap

    jvm 性能调优工具之 jmap 概述 命令jmap是一个多功能的命令.它可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息.查看 ClassLoader 的信息以及 fi ...

  3. jvm 性能调优工具之 jps 命令详解

    JPS名称:jps - Java Virtual Machine Process Status Tool命令用法:jps [options] [hostid] options:命令选项,用来对输出格式 ...

  4. Linux性能分析调优工具介绍

    1.常用性能分析工具 1)CPU性能分析工具 vmstat ps sar time strace pstree top 2)Memory性能分析工具 vmstat strace top ipcs ip ...

  5. JVM 性能调优工具

    jdk自带的工具,在macOs系统中的目录位置(jdk具体版本位置要替换):/Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Ho ...

  6. 【十三】jvm 性能调优工具之 jstack

    一.介绍 jstack是java虚拟机自带的一种堆栈跟踪工具.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项&qu ...

  7. jvm 性能调优工具之 jmap 命令详解

    jmap名称:Java Memory Map(内存映射) 官方文档:https://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jmap.html ...

  8. 【十二】jvm 性能调优工具之 jhat (JVM Heap Analysis Tool)

    jhat也是jdk内置的工具之一.主要是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言. jhat 非常耗费cpu和内存,所以一般不使 ...

  9. jvm 性能调优工具之 jstat

    概述 Jstat是JDK自带的一个轻量级小工具.全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建 ...

随机推荐

  1. AD(Altium Designer)PCB布线中的“格式刷”,助力快速布局布线

    摘要:在AD(Altium Designer)进行电路板布线时,孔丙火(微信公众号:孔丙火)经常会碰到电路中有相同功能的模块,比如2路相同的RS485通信电路.多路相同继电器输出电路.多路相同的输入电 ...

  2. ansible-playbook安装tomcat

    1. ansible-playbook安装tomcat  1) 编写playbook的tomcat安装配置 1 [root@test-1 bin]# vim /ansible/tomcat/bin/t ...

  3. CSGO 服务端扩展插件开发记录之"DropClientReason"(1)

    最近开始接触到了CSGO这款游戏,还是老套路,就是想千方百计的从里面增添新的游戏功能,当然刚开始想做到游刃有余是有点困难, 跟之前做CS1.6的第三方开发一样,都得自己慢慢的摸索过来,纵然CSGO所使 ...

  4. 多测师讲解自动化测试 _RF课堂_定位详解(002上午)_高级讲师肖sir

    1,打开克览器 2.id定位 Input Text id=kw 我是id定位 #id定位方法 3.name定位 Input Text name=wd 我是name定位方法 #我是name定位方法 4. ...

  5. 多测师讲解接口测试__mock___高级讲师肖sir

    一.关于Mock测试 1.什么是Mock测试?mock测试,源自于英文单词fake,意为假的测试实际工作中用于模拟那些无法实时连接的后端,或是没有开发出来的后端,用于获得结果反馈的一种测试方式.通过发 ...

  6. docker启动服务---------------redis

    1. docker拉取镜像 docker pull redis 2 建立配置目录和准备配置文件 mkdir -p /usr/local/docker-redis && cd /usr/ ...

  7. spring boot:使用多个线程池实现实现任务的线程池隔离(spring boot 2.3.2)

    一,为什么要使用多个线程池? 使用多个线程池,把相同的任务放到同一个线程池中,可以起到隔离的作用,避免有线程出错时影响到其他线程池,例如只有一个线程池时,有两种任务,下单,处理图片,如果线程池被处理图 ...

  8. Linux运维学习第一周记

    1 当年白岳伴清游, 2 江石台空一苇浮. 3 缥渺临风闻郢曲, 4 殷勤歧路看吴钩. 老气横秋方知世间沧桑! 以前一直忙,没有时间沉浸下来学习,一直都是浮着. 至此大疫,给生命按下了暂停键. 踏踏实 ...

  9. JS错误写法[清除DOM]

    前言 我现在总结一下我之前敲代码犯的错误,清除DOM元素,我们开始写代码吧! HTML <h1 style="font-size: 18px;font-weight: bold;col ...

  10. IDEA提示类注释的wrong tag警告的解决办法

    当创建一个类的时候,给类写上注释时,出现类似于"Wrong tag 'date' less... (Ctrl+F1)"这种警告,解决方式是: alt + enter -> a ...