JVM监控及诊断工具(一)

jps查看正在运行的java进程

类似linux中的ps命令
它的基本使用语法为:
jps [options] [hostid]
我们可以通过追加参数,来打印额外的信息。

options 参数

-q :仅仅显示进程ID
在这里插入图片描述

-l :输出应用程序主类的全类名或者如果进程执行的是jar包,则输出jar完整路径
在这里插入图片描述

-m: 输出虚拟机进程启动时传递给主类main()的参数
在这里插入图片描述

-v :列处虚拟机进程启动时的JVM参数。比如:-Xmx20m -Xmx40m是启动程序制定的jvm参数
在这里插入图片描述

说明以上参数可以综合使用
补充:如果某java进程关闭了默认开启的UsePerfData参数(即使用参数-XX:-UsePerfData),那么jps命令(以及下面介绍的jstat)将无法探知该java进程。
在这里插入图片描述

`

jstat查看JVM统计信息

jstat:用于监视虚拟机各种运行状态信息的命令工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。在没有GUI图形界面,只提供了春文件控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。常用于检测垃圾回收问题以及内存泄漏问题。
官方文档:
http://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html

基本语法
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

interval 参数:用于指定统计数据的周期,单位毫秒。即查询间隔
count 参数 用于指定查询的总次数
-t 参数 在输出信息前加一个时间,显示程序运行的时间,单位秒
-h 参数 输出多少行数据后输出一个表头

option参数:

  • 类装载相关的:
    -class:显示ClassLoader的相关信息:类的装载、卸载数据、总空间、类装载所消耗的时间等
    在这里插入图片描述

  • 垃圾回收相关的(单位都是字节)
    -gc : 显示GC相关的堆信息。包含Eden、S0、S1、老年代、永久代、已用空间、GC时间合计等信息
    -gccapacity:显示内容与-gc基本相同。但输出主要关注各个区域使用到的最大、最小空间
    -gcutil 显示内容与-gc基本相同。但输出主要关注已使用空间占总空间的百分比。
    -gccause:与-gcutil功能一样,额外输出导致最后一次或当前正在发生的GC产生的原因
    -gcnew:显示新生代的GC状况
    -gcnewcapacity:显示内容与-gcnew基本相同,主要关注使用到的最大、最小空间
    -gcold显示老年代GC状况
    在这里插入图片描述
    经验:我们可以比较JAVA进程的启动时间以及总GC时间(GCT列),或者两次测试的间隔时间以及总GC时间的增量,来得出GC时间占运行时间的比例。如果该比例超出20%,则说明目前对的压力比较大;如果该比例超出90%,则说明堆里几乎没有可以用的空间,随时都可能抛出OOM异常

jstat 还可以用来判断是否出现内存泄漏的情况

第1步:在长时间运行的java程序中,我们可以运行jstat命令连续获取多行性能数据,并取这几行数据中OU列(即已占用的老年代内存)最小值

第2步: 然后,我们每隔一段较长的时间重复一次上述操作,来获取多组OU最小值。如果这些值呈上涨趋势,则说明该java程序的老年代内存已使用量在不断上涨,这意味着无法回收的对象在不断增加,因此很有可能存在内存泄漏

  • JIT相关的
    -compiler:显示JIT编译器编译过的方法、耗时等信息
    -printcompilation 输出已经被JIT编译的方法

jinfo实时查看和修改JVM配置参数

查看虚拟机配置参数信息,也可用于调整虚拟机的配置参数
在很多情况下,java应用程序不会指定所有的java虚拟机参数。而此时,开发人员可能不知道某一个具体的java虚拟机参数的默认值。在这种情况下,可能需要通过查找文档获取某个参数的默认值。这个查找过程可能是非常艰难的。但有了jinfo工具,开发人员可以很方便的找到java虚拟机参数的当前值。

  • jinfo -sysprops PID 可以查看有System.getProperties()取得的参数
  • jinfo -flags PID 查看曾经赋过值的一些参数
  • jinfo -flag 具体参数 PID 查看某个java进程的具体参数的值
    在这里插入图片描述
    在这里插入图片描述
    jinfo不仅可以查看运行时某一个java虚拟机参数的实际取值,甚至可以在运行时修改部分参数,并使之立即生效,但是,并非所有参数都支持动态修改。参数只有被标记manageable的flag可以被实时修改。其实这个修改能力是极其有限的。
    使用命令 java -xx:PrintFlagsFinal -version | grep manageable 查看被标记为manageable的参数
    在这里插入图片描述
    针对boolean类型修改 jinfo -flag [+|-]具体参数 PID
    针对非boolean类型修改 jinfo -flag 具体参数=具体参数值 PID
    在这里插入图片描述
    java -XX:+PrintFlagsInitial 查看所有JVM参数启动的初始值
    java -XX:+PrintFlagsFinal 查看所有JVM参数启动的最终值
    java -XX:+PrintCommandLineFlags 查看那些已经被用户或者JVM设置过的详细的XX参数的名称和值

jmap导出内存映射文件&内存使用情况

jmap:作用一方面是获取dump文件(堆转储快照文件,二进制文件),它还可以获取目标java进程的内存相关信息,包括java堆各区域的使用情况,堆中对象的统计信息,类加载信息等
基本使用语法:
jmap [option] <pid>
option参数

  • -dump 生产java堆转储快照:dump文件;
    特别的: -dump:live只保存堆中的存活对象
    Heap Dump在触发内存快照的时候会保存此刻的信息如下:
    所有对象,
    所有实例,
    gc roots ,
    thread stacks,
    local variables
    说明:通常在写Heap Dump 文件前会触发一次Full GC,所以heap dump 文件里保存的都是Fu’ll GC 后留下的对象信息
    由于生产dump文件比较耗时,因此大家需要耐心等待,尤其是大内存镜像生成dump文件则需要耗费更长的时间来完成。

手动生成:
保留所有对象
jmap -dump:format=b,file=<filename.hprof> <pid>
保留存活对象
jmap -dump:live,format=b,file=<filename.hprof> <pid>
自动生成:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=<filename.hprof>在这里插入图片描述

由于jmap将访问堆中的所有对象,为了保证在此过程中不被应用线程干扰,jmap需要借助安全点机制,让所有线程停留在不改变堆中数据的状态。也就是说,由jmap导出的堆快照必定是安全点位置的。这可能导致基于该堆快照的分析结果存在偏差。举个例子,假设在编译生成的机器码中,某些对象的生命周期在两个安全点之间,那么 :live
选项将无法探知到这些对象。另外,如果某个线程长时间无法跑到安全点,jmap将一直等下去。与前面讲的jstat则不同,垃圾回收器会主动将jstat所需要的摘要数据保存至固定位置之中,而jstat只需要直接读取即可。

  • -heap 输出整个对空间的详细信息,包括GC的使用,堆配置信息,以及内存的使用信息等
  • -histo 输出堆中对象的统计信息,包括类,实例数量和合计容量
    特别的:-histo:live只统计堆中的存活对象

jstack打印JVM中线程快照

生成线程快照的作用:可用于定位线程出现长时间停顿的原因,如线程间死锁,死循环,请求外部资源导致的长时间等待等问题。这些都是导致线程长时间停顿的常见原因。当线程出现停顿时,就可以用jstack 显示各个线程调用的堆栈情况。
在thread dump 中,要留意下面几种状态

  • 死锁。Deadlock(重点关注)
  • 等待资源,Waiting on condition (重点关注)
  • 等待获取监视器,Waiting on monitor entry (重点关注)
  • 阻塞,Blocked(重点关注)
  • 执行中,Runnable
  • 暂停,Suspended
  • 对象等待中, Object,wait()或者TIMED_WAITING
  • 停止,Parked

基本语法
jstack pid
在这里插入图片描述

jcmd 多功能命令行

在JDK1.7以后,新增了一个命令行工具jcmd
它是一个多功能的工具,可以用来实现前面除了jstat之外所有命令的功能。比如:用它来导出堆,内存使用,查看java进程,导出线程信息、执行GC、JVM运行时间等
jcmd拥有jmap的大部分功能,并且在oracle的官方网站上也推荐使用jcmd命令代替jmap命令

列出所有的java进程
在这里插入图片描述
某一个java进程可使用的命令
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值