JAVA分析工具

今天小编讲的是JAVA的分析工具,我们程序员使用java语言编写java程序所需的开发工具包是JDK,JDK顾名思义是java开发工具包,是提供给程序员使用的。JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具,比如jps,jinfo,jstack,jstat,jmap等,今天小编讲的就是这几个简单的工具哦。

在JAVA开发过程中我们会遇到各种问题:内存不足,内存泄漏,线程死锁,进程消耗CPU过高等等各种问题,也许我们重启一下机器就行,但查到原因然后对症下药岂不更好。

Jps命令

说明:

jps主要用来输出JVM中运行的进程状态信息

用法

jps [-q] [-mlvV] [<hostid>]

常用选项:

-q:静默模式;
-v:显示传递给jvm的命令行参数;
-m:输出传入main方法的参数;
-l:输出main类或jar完全限定名称;
-V:显示通过flag文件传递给jvm的参数;
[<hostid>]:主机id,默认为localhost;

java 完整的lr分析程序 java程序分析工具_JVM


当然也是可以俩个参数一起调用的:

  • 显示传递给jvm的命令行参数,输出main类或jar完全限定名称
  • 输出传入main方法的参数

Jinfo命令

说明:查看进程的运行环境参数,主要是jvm命令行参数;

用法:jinfo [option] <pid>

选项:

-flags       打印命令行参数

-sysprops      打印系统属性

实例:

1.jinfo 9719 [包含JDK和JVM一起运行的属性]

2. jinfo -sysprops 9719 [包含JDK运行的属性]

3. jinfo –flags 9719 [包含JVM运行的属性]

Jstack命令:

说明:查看指定的java进程的线程栈的相关信息;

用法:

jstack [-l] <pid>

jstack -F [-m] [-l] <pid>

-l:long listings,会显示额外的锁信息,因此,发生死锁时。

常用此选项;

-m:混合模式,既输出java堆栈信息,也输出C/C++堆栈信息;

-F:当使用"jstack -l PID"无响应,可以使用-F强制输出信息;

这里小编建议先用命令htop查看各项信息,如果比如下图7343耗时比较大,然后就可以用jstack命令查看具体信息:

jstack 7343

java 完整的lr分析程序 java程序分析工具_命令行参数_02


命令jstack也有参数的

  • 会显示额外的锁信息,因此,发生死锁时常用此选项; jstack -l 7343
  • 混合模式,既输出java堆栈信息: jstack -m 7343
  • 使用-F强制输出信息 (当使用"jstack -l PID"无响应,可以使用- )  

Jstat命令

说明:对jvm应用程序的资源和性能进行实时监控;

用法:

jstat -help|-options 
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

常用选项:

jstat -options 
-class:class loader 类加载统计 
-compiler:JIT 编译统计 
-gc:gc 
-gcnew:新生代 
-gcold:老年代 
-printcompilation JVM编译方法统计 
[<interval> [<count>]] 
interval:时间间隔,单位是毫秒; 
count:显示的次数;

java 完整的lr分析程序 java程序分析工具_命令行参数_03


每隔1秒显示1000次:

java 完整的lr分析程序 java程序分析工具_命令行参数_04


S0C、S1C、S0U、S1U:Survivor 0/1区容量(Capacity)和使用量(Used)

EC、EU:Eden区容量和使用量

OC、OU:年老代容量和使用量

PC、PU:永久代容量和使用量

YGC、YGT:年轻代GC次数和GC耗时

FGC、FGCT:Full GC次数和Full GC耗时

GCT:GC总耗时

java 完整的lr分析程序 java程序分析工具_命令行参数_05


   

java 完整的lr分析程序 java程序分析工具_java 完整的lr分析程序_06


 

Jmap命令

说明:查看jvm占用物理内存的状态

1..命令格式

jmap [ option ] pid 
 jmap [ option ] executable core 
 jmap [ option ] [server-id@]remote-hostname-or-IP

2.语法说明

1).options

executable Java executable from which the core dump was produced.(可能是产生core dump的java可执行程序)

core 将被打印信息的core dump文件

remote-hostname-or-IP 远程debug服务的主机名或ip

server-id 唯一id,假如一台主机上多个远程debug服务

2).基本参数

-dump:[live,]format=b,file=<filename> 使用hprof二进制形式,输出jvm的heap内容到文件,live子选项是可选的,假如指定live选项,那么只输出活的对象到文件。

-finalizerinfo 打印正等候回收的对象的信息。

-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况。

-histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀"*". 如果live子参数加上后,只统计活的对象数量。

-permstat 打印classload和jvm heap长久层的信息. 包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来。

-F 强迫在pid没有相应的时候使用-dump或者-histo参数,在这个模式下live子参数无效。

-h | -help 打印辅助信息

-J 传递参数给jmap启动的jvm

pid 需要被打印配相信息的java进程id,可以用jps查询

 

jmap:Memory Map, 用于查看堆内存的使用状态;

java 完整的lr分析程序 java程序分析工具_java 完整的lr分析程序_07


查看堆空间的详细信息:jmap -heap 7343

查看堆内存中的对象的数目,只统计活动对象:jmap -histo live 7343

   

java 完整的lr分析程序 java程序分析工具_JVM_08


   

java 完整的lr分析程序 java程序分析工具_java_09


java 完整的lr分析程序 java程序分析工具_JVM_10


排错方法:

比如某Tomcat不可用:

  • 服务正常?(如果8080访问不了,就开始查看ip,端口,防火墙)
  • ip可以通信?
  • 端口?
  • 防火墙?
  • 应用问题(URL,代码,日志正常)

某个Tomcat不可用,查看:IP,端口,中间链路是不是通的(iptables),主机名,应用本身问题(代码问题,现在可以查看日志了)

协议中最主要的信息:URL路径