作者:双子孤狼

blog.csdn.net/zwx900102/article/details/108227591

JVM参数

所谓的JVM调优说白了就是去设置一个合理的,适合当前系统的JVM所提供的参数。从总体上来说JVM参数可以分为三大类:标准参数,-X参数,-XX参数。

标准参数

以“-”开头的参数称之为标准参数,标准参数是任何一个JDK版本都支持的参数,比较稳定,一般不会随着jdk版本的变化而变化。
比如:

-version
-help
-server
-cp

-X参数

以-X开头的参数是在特定版本HotSpot支持的命令,jdk版本变化之后,参数可能会发生变化。这个参数用的比较少。如以下几种:

-Xint   解释执行
-Xcomp  第一次使用就编译成本地代码
-Xmixed  混合模式,JVM自己来决定

这种参数用的比较少,了解就可以了,在这里不做演示

-XX参数

-XX是一种不稳定的参数,下一个版本可能会取消。-XX是JVM调优时的主要参数。

-XX参数分为Boolean型和非Boolean型。

Boolean型

Boolean类型的-XX参数使用格式为:

-XX:[+-]<name>      +或-表示启用或者禁用name属性

如:

-XX:+UseConcMarkSweepGC  表示启用CMS类型的垃圾回收器
-XX:+UseG1GC             表示启用G1类型的垃圾回收器
-XX:+PrintFlagsFinal     表示打印出所有的JVM参数信息

打印所有JVM参数

我们用-XX:+PrintFlagsFinal去打印一下所有的参数出来看一下:

任意新建一个Java类:

package com.zwx.jvm;public class TestJVMParam {public static void main(String[] args) {System.out.println(11);}
}

本人用的是IntelliJ IDEA工具,选择:Run–>Edit Configurations,然后点击左边的+号,选择Application,出现如下所示界面,加入JVM参数:

然后运行main方法,就会打印出所有参数(有700多个):

注意:上图中打印出来的参数中“=”表示默认值,“:=”表示被用户或JVM修改后的值

非Boolean型

非Boolean类型的-XX参数的使用格式为:

-XX<name>=<value>    name表示属性,value表示属性对应的值

如:

-XX:MaxMetaspaceSize=5M    设置最大永久代空间大小(jdk1.8)

其他参数

还有其他一些我们非常常用的参数,比如:-Xms,-Xmx,-Xss,但是实际上这几种参数也是属于-XX参数,这几种写法不过就是一种为了方便而设置的简写形式。所以在上面打印出来的参数中搜索-Xms,-Xmx,-Xss是搜索不到的。

-Xms1000等价于-XX:InitialHeapSize=1000
-Xmx1000等价于-XX:MaxHeapSize=1000
-Xss100等价于-XX:ThreadStackSize=100

常用JVM参数

常用命令监控工具

jdk中的bin目录下提供了许多功能强大的工具可以帮助我们监控虚拟机的使用情况,掌握了这些常用工具的使用可以帮助我们更快更直观的分析问题。

工具和参数都是在不断使用的过程中掌握的,并不需要一下子就全部看完,可以大致浏览有个印象,建议大家可以收藏本篇文章,后续需要用到的时候方便查看

以下的演示均是基于linux环境下jdk1.8版本进行演示,不能环境和版本可能会有较大差异。

Java(TM) SE Runtime Environment (build 1.8.0_151-b12)

jps

jps:JVM Process Status Tool,一款用于查看java进程的工具。这款工具的功能非常简单,就是查看当前环境下运行的java服务的进程id和名称,一般其他命令使用前都会先使用jps命令获取java进程信息。

如下图所示:

jps参数主要有如下选项:

jstat

jstat:JVM Statistics Monitoring,一款用于监视虚拟机各种运行状态统计信息工具。主要可以显示如下信息:虚拟机进程的类装载、内存、垃圾收集、JIT编译等运行数据信息。

查看类装载信息

jstat -class PID 1000 10 //查看某个java进程的类装载信息,每1000毫秒输出一次,共输出10次

在这里插入图片描述

查看垃圾收集信息

jstat -gc PID 1000 10


上图中就显示个各个区以及垃圾回收的情况,具体代表含义如下:

注意:C表示Capacity(容量),U表示Used(已使用大小)

  • 1、S0C、S1C表示的是Survive区的S0和S1大小(Capacity)

  • 2、S1U、S2U表示已使用空间大小(Used)

  • 3、EC、EU分别表示Eden区总容量和已使用容量大小

  • 4、OC、OU分别表示老年代总空间大小和已使用大小

  • 5、MC、MU:表示方法区(jdk1.8中通过Metaspace实现)的总空间大小和已使用大小

  • 6、CCSC、CCSU:表示压缩类空间总大小和已使用大小

  • 7、YGC、YGT:新生代GC次数和GC总耗时

  • 8、FGC、FGCT:Full GC次数和Full GC总耗时

  • 9、GCT:GC总消耗时间

如果对上面含义中涉及到的各种分区不了解的,可以参考:

https://blog.csdn.net/zwx900102/article/details/108108555

jstat参数常用选项

jstack

jstack:Stack Trace for Java,一款用于生成当前时刻的线程状态信息的快照工具。这个对于用来分析当前线程状态时非常有用的,比如说是否有哪个线程阻塞了,或者说是否发生死锁等信息。
如:

jstack PID


可以清晰的看到当前线程的状态。另外线程的名字也会打印出来,所以在我们自己创建线程的时候建议是采用自定义的名称,这样如果有异常我们可以很容易的知道是哪个线程出了问题。

jstack参数常用选项

jinfo

jinfo:Configuration Info For Java,一款用于实时查看和修改JVM参数的工具。

注意,如果是修改的话,只能用我们上面使用命令打印出来参数中的manageable类型才可以被修改。

jinfo -flag name PID 查看某个java进程的name属性的值
jinfo -flags PID 查看已经赋值的JVM参数

针对Boolean类型的-XX参数修改命令为:

jinfo -flag [+|-]name PID

针对非Boolean类型的-XX参数修改命令为:

jinfo -flag name=value PID

如:

jmap

jmap:Memory Map for Java,一款用于生成堆转储快照即dump文件的命令。
如:

jmap -heap PID  //打印出堆内存相关信息

在这里插入图片描述
jmap -dump:format=b,file=/usr/heap.hprof PID //生成dump文件


但是其实上面的常用参数中也有一个参数可以设置,一旦发生OutOfMemoryError之后就会自动生成dump文件,这对我们分析生产环境发生OOM的原因是非常重要的。

如下,我们再idea中进行设置自动生成dump文件:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.hprof

我们利用一个堆内存的例子来进行演示一下:


运行之后发生OOM异常,然后可以找到对应目录下已经生成了dump文件。

既然我们生成了dump文件,肯定是要对文件进行分析的,但是我们怎么分析这个文件呢?因为直接打开时乱码的,所以我们肯定需要一款工具来对dump文件进行分析

jhat

jhat:JVM Heap Analysis Tool,一款用来分析dump文件的工具。
如:

jhat heap.hprof


然后访问地址:http://localhost:7000/。

可以看到,这款工具所展示的信息比较简单,而且因为是命令形式的,所以很难直接分析出问题,一般情况如果有其他工具可以选择的话,并不建议使用这款工具来分析,接下来我们就来看一看可视化工具的使用

可视化监控工具

JConsole工具

JConsole:Java Monitoring and Management Console,是一款JDK自带的可视化监控工具。其实就是把上面的比如jstat,jstack等命令工具统计的信息可视化了,主要可以查看java应用程序的运行概况、监控堆信息、永久区使用情况、类加载情况等信息。

JConsole使用方式可以直接在命令行中输入命令:jconsole,或者直接找到jdk安装目录下找到jconsole.exe执行文件,双击打开即可。

本地连接的话很简单,选中一个服务双击即可,如果是远程连接,需要远程的Java服务在启动的时候就配置JMX相关连接参数。
进入之后看到如下界面:

可以看到顶部有6个标签可以切换,在这里就不详细去介绍每个地方有什么用了,自己去尝试的话其实是一目了然的,可以看到内存各个区间的使用情况,线程信息(线程名字都会展示),以及类加载等信息。

VisualVM工具

VisualVM:All-in-one Java TroubleshootingTool,是JDK发布的一款功能最强大的运行监控故故障处理工具,正如名字所说的All-in-one,可以预见这是一款功能非常齐全的工具。
VisualVM主要功能如下:

  • 显示虚拟机进程及进程的配置环境信息(jps、jinfo功能)。

  • 监视应用程序的CPU、GC、堆、方法区和线程信息(jstat、jstack功能)。

  • dump文件生成及分析(jmap、jhat功能)。

  • 方法级的程序性能分析,可以找出被调用最多,运行时间最长的方法。

  • 离线程序快照:收集程序运行时配置、线程dump、内存dump等信息建立一个快照,并可以将快照发送开发者处进行Bug反馈

  • 插件化处理,可以有无限扩展的可能性

打开VisualVM工具的方式可以直接在命令行中输入命令:jvisualvm,或者直接找到jdk安装目录下找到jvisualvm.exe执行文件,双击打开即可。

打开之后在左边选择自己的本地或者远程应用(同样需要远程服务支持JMX服务)之后,可以看到右边界面,注意,默认只有前面5个页签,最后一个页签是插件加入进来的,不同的插件可以看到不同的功能,我这边选择的插件是com-sun-tools-visualvm-modules-visualgc.nbm插件,这是一个比较有意思的插件,感兴趣的可以尝试下。

插件使用和下载

点击主界面工具栏内:工具–>插件–>已下载–>添加插件,然后安装即可,如下图:

安装之后重新打开就可以看到多了一个页签,打开之后可以实时监控内存变化

在插件页面点击设置可以看到最新的插件下载地址(需要vpn才能连接):

分析dump文件

假如生产环境发生OutOfMemoryError,我们拿到dump文件之后,就可以借助VisualVM来使用,点击工具栏中文件–>装入(注意要选择文件类型),然后找到对应的dump文件就可以打开了

打开之后点击“类”:

可以看到是Integer对象撑爆了内存,因为上面的例子是是一个非常简单的demo,就是不断地往list中添加了Integer数据,所以结合工具可以非常清晰的看到是这个对象出了问题,从而定位到问题所在。

这个工具也可以直接dump文件:

这个工具也可以实时设置自动dump文件分析:

总之这是款非常强大的工具,还有其他许多功能,而且插件化工作原理使得其提供了无限的功能扩展,有兴趣的可以自己去官网下载不同的插件下来进行试用

其他工具

除了JVM官方提供的工具,还有其他第三方也提供了一些非常优秀的工具可以帮助我们更好的分析dump文件,比如说阿里巴巴提供的在线实时分析工具Arthas,还有 MAT,Histogram等都是非常优秀的工具。

总结

本文主要介绍了一些JVM的一些常用参数的使用,以及JVM提供的一些常用的监控工具,并且利用一个OOM例子结合工具来讲述了如何分析OOM时的dump文件。

当然,本文的主要目的是告诉大家有哪些工具可以使用,但是对一个工具的使用并没有非常详细的介绍,大家都是程序员,相信只要知道了有这么一款工具,使用的时候也可以非常容易上手,关键在于实践,多使用才能积累经验。

工具毕竟只是工具,只是可以更好的帮助我们分析问题,更重要的是发现问题之后该如何针对问题进行修改和优化,这才是使用工具的目的。

END

推荐好文

强大,10k+点赞的 SpringBoot 后台管理系统竟然出了详细教程!

为什么MySQL不推荐使用uuid或者雪花id作为主键?

为什么建议大家使用 Linux 开发?爽(外加七个感叹号)

IntelliJ IDEA 15款 神级超级牛逼插件推荐(自用,真的超级牛逼)

炫酷,SpringBoot+Echarts实现用户访问地图可视化(附源码)

记一次由Redis分布式锁造成的重大事故,避免以后踩坑!

十分钟学会使用 Elasticsearch 优雅搭建自己的搜索系统(附源码)

JDK常用监控指令和监控工具介绍及案例分析使用教程,非常实用!相关推荐

  1. redis常用linux指令(无介绍快使用)

    redis常用linux指令(无介绍快使用) 问题背景 登录关闭redis 创建键值对 切换16个数据库 数据库键的数量 清空数据库 模糊查询 通配符单个字符? 通配括号内的某一个字符 判断key是否 ...

  2. puppet成长日记二 Package资源详细介绍及案例分析

    puppet成长日记二 Package资源详细介绍及案例分析 一.系统环境 1.puppet服务端 Release:RHEL6.4 HOSTNAME: puppetserver.rsyslog.org ...

  3. Exchange 分析器工具介绍及案例分析

    除了可以下载这些工具,这些工具也包含在Exchange Server 2007 Toolbox 中,可以从Exchange Management Console来访问. 对这些工具我们有很大的热情,并 ...

  4. 【学术研讨课】新型清洁高效煤粉工业锅炉系统 介绍及案例分析2018-06-13

    20190822更新:主要参考文献

  5. CICD介绍与案例分析

    一.什么是CI(持续集成)? 可以帮助开发人员更加频繁地(有时甚至每天)将代码更改合并到共享分支或"主干"中. 系统会通过自动构建应用并运行不同级别的自动化测试来验证这些更改,确保 ...

  6. 常用监控与prometheus监控的简介

    文章目录 一.常用监控简介 ❻zabbix核心组件介绍 #Zabbix 4.Prome theus .borg . kubernetes Prometheus具有以下特性: ❾可利用Pushgatew ...

  7. SPI协议分析仪的使用介绍及flash无法启动两种案例分析

    SPI协议分析仪的使用介绍及案例分析 一.协议分析仪介绍 Kingst LA5016 USB 协议分析仪,支持众多标准协议解析,包括:UART/RS232/485,I2C,SPI,CAN,SMBUS等 ...

  8. 浅析VS2010反汇编 VS 反汇编方法及常用汇编指令介绍 VS2015使用技巧 调试-反汇编 查看C语言代码对应的汇编代码...

    浅析VS2010反汇编 2015年07月25日 21:53:11 阅读数:4374 第一篇 1. 如何进行反汇编 在调试的环境下,我们可以很方便地通过反汇编窗口查看程序生成的反汇编信息.如下图所示. ...

  9. mysql中的操作指令,MySQL中常用指令操作的介绍(代码示例)

    本篇文章给大家带来的内容是关于MySQL中常用指令操作的介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. l 创建数据库:CREATE DATABASE table_n ...

最新文章

  1. hadoop2.4.1集群搭建
  2. java 唯一值_java – 在列表中查找唯一值的快速方法
  3. 智源唐杰主编的IEEE Transactions on Big Data期刊被SCI收录 | AI日报
  4. mysql的基准测试_mysql基准测试 -benchmarks
  5. 成电计算机学院保研率,985一条街的街友们,我就想问问电子科技大学(成电)到底是什么水平的学校啊!...
  6. oracle 创建自增列及其oracle表的字段的子节点的查询
  7. 亚马逊云科技首次发布“三驾马车”中国业务战略
  8. spring boot之session的创建,销毁,超时,监听等等小结
  9. quick: setup_mac.sh分析
  10. ltp-ddt qspi_mtd_dd_rw error can't read superblock on /dev/mtdblock0
  11. Mac可以在Dock上监视磁盘活动
  12. php通用查询系统excel,php+excel通用课表查询系统
  13. Go 开发关键技术指南 | 带着服务器编程金刚经走进 2020 年
  14. python统计元音字母个数_Quzh[python]统计元音字母——输入一个字符串,统计处其中元音字母的数量。...
  15. 20181212——第五章 引用类型
  16. 如何打造数据化决策管理
  17. html 下拉图片列表,图片、表单、下拉选项
  18. 数据杂谈:Tableau 推动智能分析时代
  19. 如何将STP文件转换为CAD文件
  20. python之DataFrame篇

热门文章

  1. 10月24日见!iQOO Neo 855版官宣:跑分不输骁龙855Plus
  2. 卸任后的马云“忙”坏了,健美大赛、蹦迪、修空调、种蘑菇,真相看懵了
  3. 周鸿祎卸任奇安信董事 后者具备上市条件
  4. 新一季“十大最堵互联网公司”出炉:360百度腾讯跻身三甲
  5. php socket_create卡顿,phpsocket_createundefined的异常解决方法
  6. mysql 数据库属性_mysql 查看数据库属性
  7. pmp知识点详解-项目大牛整理_PMP项目管理第六章:项目进度管理(5)核心知识点...
  8. 摄像头图像分析目标物体大小位置_对智能驾驶系统三种环境传感器布局的冗余关系分析...
  9. 匹配特殊字符的正则表达式
  10. 【Flink】Flink SQL 开源UI平台 flink-streaming-platform-web