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;
当然也是可以俩个参数一起调用的:
- 显示传递给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
命令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:显示的次数;
每隔1秒显示1000次:
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总耗时
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, 用于查看堆内存的使用状态;
查看堆空间的详细信息:jmap -heap 7343
查看堆内存中的对象的数目,只统计活动对象:jmap -histo live 7343
排错方法:
比如某Tomcat不可用:
- 服务正常?(如果8080访问不了,就开始查看ip,端口,防火墙)
- ip可以通信?
- 端口?
- 防火墙?
- 应用问题(URL,代码,日志正常)
某个Tomcat不可用,查看:IP,端口,中间链路是不是通的(iptables),主机名,应用本身问题(代码问题,现在可以查看日志了)
协议中最主要的信息:URL路径