欢迎光临散文网 会员登陆 & 注册

JVM调优工具介绍(2)

2023-06-27 23:21 作者:驿路梅花带雪看2  | 我要投稿

对大多数java开发从业人员来说,对jvm进行调优是许多java开发人员必然碰到的难题。工欲善其事必先利其器,给系统定位,知识、经验是关键,但同样选择一款趁手适合的工具同样重要!现在我们继续上篇介绍一些jvm调优工具。

1、 jinfo:java配置信息工具

jinfo的作用是实时查看和调整虚拟机各项参数,使用jps -v命令可以查看虚拟机启动时显式指定的参数列表,如下图所示:

jps -v

jps -v查看jvm参数

但是如果想知道未被显式指定的参数系统的默认值,除了去查找资料之外,就只能使用jinfo -flag命令查询了(JDK6版本或者以上也可以使用java -XX:+PrintFlagsFinal查看参数的默认值)。jinfo -sysprops命令还可以将虚拟机的System.getProperties()中的参数打印出来,这个命令是在jdk5时linux版本发布的,但是当时只提供了查询的功能。jinfo -flag命令、java -XX:+PrintFlagsFinal、jinfo -sysprops命令分别如下图所示:

jinfo

jinfo -flag查看具体参数

jinfo

java -XX:+PrintFlagsFinal查看参数

java -XX:+PrintFlagsFinal

jinfo -sysprops查看jvm参数

jdk6之后,jinfo在windows平台和linux平台都有提供,并且加入了运行期修改部分参数的能力(可以使用-flag [+|-]name或者 -flag name=true在运行期修改一部分运行期可写的虚拟机参数值)。但在windows平台,jdk6提供的功能仍然有较大限制,只提供了最基本的-flag选项。jinfo命令的基本格式如下:

jinfo {options} pid

举个例子,查看CMSInitiatingOccupancyFraction参数值:

jinfo -flag CMSInitiatingOccupancyFraction

jinfo -flag查看CMSInitiatingOccupancyFraction参数值

特别声明有些jinfo命令是不需要属性值的,比如jinfo -sysprops:

jinfo -sysprops

jinfo -sysprops查看system.getProperties()参数

2、 jmap:java内存映像工具

jmap(Memory Map of java)是用于生成堆转储快照(一般称之为heapdump或者dump文件),如果不使用jmap命令,要想获取java堆转储快照一般的使用一些比较"暴力"的方式。比如说使用命令:-XX:+HeapDumpOnOutOfMemoryError,也可以让虚拟机在出现内存溢出异常后自动生成堆转储快照文件,通过-XX:+HeapDumpOnCtrlBreak参数则可以使用ctrl+break键让虚拟机生成堆转储快照文件,又或者在linux系统下通过Kill -3命令发出进程退出信号,"恐吓"一下虚拟机也能顺利拿到堆转储快照。

-XX:+HeapDumpOnOutOfMemoryError

idea设置-XX:+HeapDumpOnOutOfMemoryError参数

-XX:+HeapDumpOnOutOfMemoryError

idea设置-XX:+HeapDumpOnCtrlBreak参数

jmap的作用不仅仅是用于获取堆转储快照,它还可以查询finalize执行队列,java堆和方法区的详细信息,如空间使用率、当前使用的是哪种垃圾收集器等。jmap的命令格式如下:

jmap [option] vmid(vmid表示虚拟机进程)

option的合法值和具体含义如下所示:

选项

作用

-dump

生成java堆转储快照,格式为-dump:[live.]fromat=b.file=,其中live参数说明是否只dump出存活的对象。

-finalizerinfo

显示在F-Queue队列中等待finalizer线程执行finalize方法的对象。只在linux或者solaris平台有效。

-heap

显示java堆详细信息,如使用了哪种回收器、参数配置、分代情况等,只在linux或者solaris平台有效。

-histo

显示堆中对象统计信息,包括类、实例数量、合计容量。

-permstat

以ClassLoader为统计口径显示永久代内存状态,只在linux或者solaris平台有效。

-F

当虚拟机进程对-dump选项没有响应时,可以使用这个选项强制生成dump快照,只在linux或者solaris平台有效。

参数在windows平台示例如下:

-dump

jmap -dump命令

jmap -dump

jmap -histo命令

但是dump下来的文件是无法直接打开的,打开会乱码,因此我们要用到另外一个工具jhat来分析分析dump文件。

jmap -histo

dump文件直接打开乱码

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

jdk提供了jhat(jvm Heap Analysis Tool)命令和jmap搭配使用,来分析jmap生成的堆转储快照。jhat内部内置了一个小型的http/web服务器,生成堆转储快照之后可以在浏览器中查看。不过在实际工作中,除非手头没有其他的工具,否则多数人是不会直接使用jhat命令来分析堆转储快照的。主要原因有两方面:1、不会在部署应用的服务器上直接分析堆转储快照,即使可以这样做,也会尽量将堆转储快照文件复制到其他机器上分析,因为分析快照文件是一个非常耗费时间和硬件资源的过程。既然都在其他机器上进行了,就没必要再受到命令行工具的限制了,另外一个原因是jhat分析工具比较简陋,后文会介绍VisualVM以及专门用于分析快照文件的Eclipse Memory Analyzer、IBM HeapAnalyzer等工具,都能实现比jhat更强大的分析功能,代码如下演示了前面jmap生成的堆转储快照文件:

jhat

jhat分析dump下来的文件

分析结果在浏览器中所示:http://locahost:7000/

http://locahost:7000/

浏览器中查看jhat分析结果

分析结果是以包为单位进行分组显示,分析内存泄露问题主要会使用到其中的"Heap Histogram"(与jmap -histo功能一样)与OQL页签的功能,前者可以找到内存中总容量最大的对象,后者是标准的对象查询语言,使用类似SQL的语法对内存中的对象进行查询统计,如果读者需要了解具体OQL的语法和标准使用方法,详见《深入理解java虚拟机·jvm高级特性和最佳实践》第三版附录D的内容。



JVM调优工具介绍(2)的评论 (共 条)

分享到微博请遵守国家法律