JVM 调优

JVM调优工具

JDK的bin目录下有很多用于监视虚拟机和故障处理的工具,这些工具都非常稳定而且功能强大,能在处理应用程序性能问题、定位故障是发挥很大的作用。

一、jps:虚拟机进程状况工具

二、jstat:虚拟机统计信息监视工具

三、jmap:Java内存印象工具

四、jhat:虚拟机堆转储快照分析工具

五、jstack:Java堆栈跟踪工具

六、jinfo:Java配置信息工具

 

jps虚拟机进程状况工具

jps工具主要选项:

选项作用
-l输出主类全名或jar路径
-q只输出LVMID
-m输出JVM启动时传递给main()的参数
-v输出JVM启动时显示指定的JVM参数

 

 

 

 

 

 

例如 jps -q 查看本机用了那些java进程 

 

26544 是Idea

24076 是jps 进程本身

15644 显示是Launcher

加参数进一步查询

不太清楚 org.jetbrains.jps.cmdline.Launcher 是做什么的,好像也是 jps的依赖吧。

总结: 

jps 命令可看当前机器里用到jdk的进程信息。

jstat虚拟机统计信息监视工具

jstat(JVM statistics Monitoring)是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。

命令格式:

jstat [ option vmid [interval[s|ms] [count]] ]

对于命令格式中的VMID与LVMID需要特别说明一下:如果是本地虚拟机进程,VMID与LVMID是一致的,如果是远程虚拟机进程,那VMID的格式应当是:

[protocol:][//]lvmid[@hostname[:port]/servername]

参数intervalcount代表查询间隔和次数,如果省略这两个参数,说明只查询一次。

假设需要每250毫秒查询一次进程2764垃圾收集状况,一共查询20次,那命令应当是:

jstat -gc 2764 250 20

选项option代表着用户希望查询的虚拟机信息,主要分为3类:类装载、垃圾收集、运行期编译状况。

jstat工具主要选项:

选项作用
-class 监视类装载、卸载数量、总空间以及类装载所耗费的时间
-gc监视Java堆状况,包括Eden区、两个Survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息 
-gccapacity 监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间 
-gcutil 监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比
-gccause 与 -gcutil 功能一样,但是会额外输出导致上一次GC产生的原因
-gcnew  监视新生代GC状况
-gcnewcapacity 监视内容与 -gcnew 基本相同,输出主要关注使用到的最大、最小空间
-gcold  监视老年代GC状况
-gcoldcapacity  监视内容与 -gcold 基本相同,输出主要关注使用到的最大、最小空间
-gcpermcapacity  输出永久代使用到的最大、最小空间
-compiler 输出JIT编译器编译过的方法、耗时等信息 
-printcompilation 输出已经被JIT编译的方法 

 

 

 

 

 

 

 

 

 

 

 

 

 

-class

例如: 

参数含义:

  • Loaded : 加载class的数量
  • Bytes : class字节大小
  • Unloaded : 未加载class的数量
  • Bytes : 未加载class的字节大小
  • Time : 加载时间

可见我这个项目加载了 15315 个类  

-compiler

输出JIT编译过的方法数量耗时等。

  • Compiled : 编译数量
  • Failed : 编译失败数量
  • Invalid : 无效数量
  • Time : 编译耗时
  • FailedType : 失败类型
  • FailedMethod : 失败方法的全限定名

-gc

垃圾回收堆的行为统计

C即Capacity 总容量,U即Used 已使用的容量

  • S0C : survivor0区的总容量
  • S1C : survivor1区的总容量
  • S0U : survivor0区已使用的容量
  • S1C : survivor1区已使用的容量
  • EC : Eden区的总容量
  • EU : Eden区已使用的容量
  • OC : Old区的总容量
  • OU : Old区已使用的容量
  • PC : 当前perm的容量 (KB)
  • PU : perm的使用 (KB)
  • YGC : 新生代垃圾回收次数
  • YGCT : 新生代垃圾回收时间
  • FGC : 老年代垃圾回收次数
  • FGCT : 老年代垃圾回收时间
  • GCT : 垃圾回收总消耗时间

其他命令介绍如下,不举例了。

-gccapacity

同-gc,不过还会输出Java堆各区域使用到的最大、最小空间。

  • NGCMN : 新生代占用的最小空间
  • NGCMX : 新生代占用的最大空间
  • OGCMN : 老年代占用的最小空间
  • OGCMX : 老年代占用的最大空间
  • OGC:当前年老代的容量 (KB)
  • OC:当前年老代的空间 (KB)
  • PGCMN : perm占用的最小空间
  • PGCMX : perm占用的最大空间

-gcutil

同-gc,不过输出的是已使用空间占总空间的百分比。

 

-gccause

垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因。

  • LGCC:最近垃圾回收的原因
  • GCC:当前垃圾回收的原因

-gcnew

统计新生代的行为。

  • TT:Tenuring threshold(提升阈值)
  • MTT:最大的tenuring threshold
  • DSS:survivor区域大小 (KB)

-gcnewcapacity

新生代与其相应的内存空间的统计。

  • NGC:当前年轻代的容量 (KB)
  • S0CMX:最大的S0空间 (KB)
  • S0C:当前S0空间 (KB)
  • ECMX:最大eden空间 (KB)
  • EC:当前eden空间 (KB)

-gcold

统计旧生代的行为。

-gcoldcapacity

统计旧生代的大小和空间。

-printcompilation

 hotspot编译方法统计。

  • Compiled:被执行的编译任务的数量
  • Size:方法字节码的字节数
  • Type:编译类型
  • Method:编译方法的类名和方法名。类名使用"/" 代替 "." 作为空间分隔符. 方法名是给出类的方法名. 格式是一致于HotSpot - XX:+PrintComplation 选项

 

jmap Java内存印象工具

jmap不仅能生成dump文件,还阔以查询finalize执行队列、Java堆和永久代的详细信息,如当前使用率、当前使用的是哪种收集器等。

命令格式:

jmap [ option ] vmid

jmap工具主要选项:

选项作用
-dump生成堆转储快照
-finalizerinfo 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
-heap显示Java堆详细信息
-histo显示堆中对象的统计信息
-permstat以ClassLoader为统计口径显示永久代内存状态。只在Linux/Solaris平台下有效
-F当-dump没有响应时,强制生成dump快照

 

 

 

 

 

 

 

 

-dump

常用格式:

-dump::live,format=b,file=<filename> pid

dump堆到文件,format指定输出格式,live指明是活着的对象,file指定文件名。

$ ./jmap -dump:live,format=b,file=dump.hprof 14948

dump.hprof这个后缀是为了后续可以直接用MAT(Memory Anlysis Tool)打开。

-finalizerinfo

打印等待回收对象的信息。

可以看到当前F-QUEUE队列中并没有等待Finalizer线程执行finalizer方法的对象。

-heap

打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况,可以用此来判断内存目前的使用情况以及垃圾回收情况。

 

-histo

打印堆的对象统计,包括对象数、内存大小等等 (因为在dump:live前会进行full gc,如果带上live则只统计活对象,因此不加live的堆大小要大于加live堆的大小 )。

内容太多

xml class name是对象类型,说明如下:

B byte
C char
D double
F float
I int
J long
Z boolean
[ 数组,如[I表示int[]
[L+类名 其他对象

-permstat

打印Java堆内存的永久保存区域的类加载器的智能统计信息。 只在Linux/Solaris平台下有效 

对于每个类加载器而言,它的名称、活跃度、地址、父类加载器、它所加载的类的数量和大小都会被打印。此外,包含的字符串数量和大小也会被打印。

-F

强制模式。如果指定的pid没有响应,请使用jmap -dump或jmap -histo选项。此模式下,不支持live子选项。

 

jhat 虚拟机堆转储快照分析工具

jhat(JVM Heap Analysis Tool)命令是与jmap搭配使用,用来分析jmap生成的dump,jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看。在此要注意,一般不会直接在服务器上进行分析,因为jhat是一个耗时并且耗费硬件资源的过程,一般把服务器生成的dump文件复制到本地或其他机器上进行分析。

命令格式:

jhat [dumpfile]

jstat工具主要选项

选项作用
-stackfalse|true 关闭对象分配调用栈跟踪(tracking object allocation call stack)。 如果分配位置信息在堆转储中不可用. 则必须将此标志设置为 false. 默认值为 true.
-refsfalse|true 关闭对象引用跟踪(tracking of references to objects)。 默认值为 true. 默认情况下, 返回的指针是指向其他特定对象的对象,如反向链接或输入引用(referrers or incoming references), 会统计/计算堆中的所有对象。
-portport-number 设置 jhat HTTP server 的端口号. 默认值 7000.
-excludeexclude-file 指定对象查询时需要排除的数据成员列表文件(a file that lists data members that should be excluded from the reachable objects query)。 例如, 如果文件列列出了 java.lang.String.value , 那么当从某个特定对象 Object o 计算可达的对象列表时, 引用路径涉及 java.lang.String.value 的都会被排除。
-baselineexclude-file 指定一个基准堆转储(baseline heap dump)。 在两个 heap dumps 中有相同 object ID 的对象会被标记为不是新的(marked as not being new). 其他对象被标记为新的(new). 在比较两个不同的堆转储时很有用.
-debugint 设置 debug 级别. 0 表示不输出调试信息。 值越大则表示输出更详细的 debug 信息.
-version启动后只显示版本信息就退出
-J< flag >因为 jhat 命令实际上会启动一个JVM来执行, 通过 -J 可以在启动JVM时传入一些启动参数. 例如, -J-Xmx512m 则指定运行 jhat 的Java虚拟机使用的最大堆内存为 512 MB. 如果需要使用多个JVM启动参数,则传入多个 -Jxxxxxx.

 

 

 

 

 

 

 

 

 

 

 

 

 

例如  

jhat -J-Xmx512m dump.hprof

 

 

用浏览器打开7000端口

服务里的所有类都在这里

点进去之后

 

jstack:Java堆栈跟踪工具

jstack用于生成java虚拟机当前时刻的线程快照。

线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。

线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。
另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。

jstack命令格式:

jstack [ option ] vmid

jstack工具主要选项:

选项作用
-F当正常输出请求不被响应时,强制输出线程堆栈
-l除堆栈外,显示关于锁的附加信息
-m如果调用到本地方法的话,可以显示C/C++的堆栈

 

 

 

 

 

 

 

jinfo Java配置信息工具

 jinfo(JVM Configuration info)这个命令作用是实时查看和调整虚拟机运行参数。 之前的jps -v口令只能查看到显示指定的参数,如果想要查看未被显示指定的参数的值就要使用jinfo口令。

jinfo命令格式:

jinfo [ option ] pid

jinfo工具主要选项:

选项作用
-flag输出指定args参数的值
-flags不需要args参数,输出所有JVM参数的值
-sysprops输出系统属性,等同于System.getProperties()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

参考:https://www.cnblogs.com/warehouse/p/9479104.html

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值