Java内存泄漏分析系列之一:使用jstack定位线程堆栈信息
Java内存泄漏分析系列之二:jstack生成的Thread Dump日志结构解析
Java内存泄漏分析系列之三:jstat命令的使用及VM Thread分析
Java内存泄漏分析系列之四:jstack生成的Thread Dump日志线程状态
Java内存泄漏分析系列之五:常见的Thread Dump日志案例分析
Java内存泄漏分析系列之六:JVM Heap Dump(堆转储文件)的生成和MAT的使用
查看JVM参数
jps -l
查看所有正在运行的Java程序,同时显示启动类类名,获取到PID
4706 org.apache.catalina.startup.Bootstrap
5023 sun.tools.jps.Jps
jinfo -flags PID
查看运行时进程参数与JVM参数
Attaching to process ID 28987, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.171-b11
Non-default VM flags: -XX:CICompilerCount=3 -XX:InitialHeapSize=132120576 -XX:MaxHeapSize=2092957696 -XX:MaxNewSize=697303040 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=44040192 -XX:OldSize=88080384 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
Command line: -Dspring.config.location=application.properties -Dspring.profiles.active=staging
java -XX:+PrintFlagsFinal -version
查看当前虚拟机默认JVM参数
查看即时GC状态
jstat -gc PID 1000 10
每秒查看一次gc信息,共10次
输出比较多的参数,每个字段的解释参看 https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
512.0 512.0 15.3 0.0 4416.0 1055.2 11372.0 7572.5 14720.0 14322.5 1664.0 1522.8 40 0.137 8 0.039 0.176
期间可能碰到提示sun.jvm.hotspot.runtime.VMVersionMismatchException: Supported versions are 24.181-b01. Target VM is 25.171-b11
的问题,原因在于安装了多个版本,使用which
、ls -l
可简介定位到与当前执行Java程序相同的Java版本
内存问题
内存泄露导致OOM?内存占用异常的高?这是生产环境常常出现的问题,Java提供dump文件供我们对内存里发生过的事情进行了记录,我们需要借助一些工具从中获取有价值的信息。
导出Dump文件
- 提前对Java程序加上这些参数印dump文件
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./
- 对正在运行的程序使用jmap:
jmap -dump:format=b,file=heap.hprof PID
分析Dump文件
如果Dump文件不太大的话,可以传到 http://heaphero.io/index.jsp 来分析
文件比较大,且想进行更加系统的分析,推荐使用MAT分析,有如下几种常用查看方式
- 首页中的【Leak Suspects】能推测出问题所在
- 点击【Create a histogram from an arbitrary set of objects】查到所有对象的数量
- 右键点击某个对象【Merge Shortest Paths to GC Roots】-> 【exclude all phantom/weak/soft etc. references】能查询到大量数量的某个对象是哪个GC ROOT引用的
线程问题
任务长时间不退出?CPU 负载过高?很可能因为死循环或者死锁,导致某些线程一直执行不被中断,但是不报错是最烦人的,所以日志里看不到错误信息,并且又不能用dump文件分析,因为跟内存无关。这个时候就需要用线程分析工具来帮我们了。
导出jstack文件
使用jstack PID > 文件
,如果失败请加-F
参数,如果还失败请使用Java程序启动时使用的用户执行jstack
排查步骤
-
top
查看到哪个java程序负载高 -
top -p PID -H
查看该进程所有进程的运行状态 - 记录下高负载的线程ID,
printf "&x" PID
转换成16进制 jstack PID > 文件
- 在jstack文件中用转换成16进制之后的线程ID查询线程运行堆栈
- 从堆栈中了解到线程在执行什么任务,并结合业务与代码判断问题所在
以下转载自: http://www.codingwhy.com/view/858.html
Java开发人员肯定都知道JDK的bin目录中有“java”、“javac”这两个命令行工具,但并非所有的程序员都了解过JDK的bin目录之中的其他工具的作用。
这些工具被Sun公司作为“礼物”附赠给JDK的使用者,并在软件的使用说明中把他们申明为“没有技术支持并且是试验性质的(unsupported and experimental)”的产品,但事实上,这些工具都非常的稳定且功能强大,能在处理应用程序性能问题、定位故障时发挥很大的作用。
细心的可能会发现,这些工具都非常小,是因为这些工具大多是jdk/lib/tools.jar类库的一层包装而已,他们主要的功能代码是在tools类库中实现的。
Java故障检修,程序概要分析,监视和管理工具
工具名称 | 用途 |
---|---|
jvisualvm | 一个图形化的Java虚拟机 参考: Java jvisualvm简要说明 |
jconsole | java监视台和管理控制台 参考: 如何利用 JConsole观察分析Java程序的运行,进行排错调优 https://www.ibm.com/support/knowledgecenter/zh/SSYKE2_8.0.0/com.ibm.java.vm.80.doc/docs/jconsole.html |
jps | JVM Process Status进程状态工具。列出目标系统的HotSpot JJVM 可以列出本机所有java进程的pid |
jstat | 按照命令行的具体要求记录和收集一个JVM的性能数据 |
jstatd | JVM jstat 的守护进程 |
jmc | Java任务控制工具(Java Mission Control),主要用于HotSpot JVM的生产时间监测、分析、诊断。 |
故障检测和修理工具
工具名称 | 用途 |
---|---|
jinfo | 配置或打印某个Java进程VM flag |
jhat | 堆储存查看器 |
jmap | Java内存图 |
jsadebugd | Java的 Serviceability Agent Debug的守护进程 |
jstack | Java堆栈跟踪 |
JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解
基本工具
这些工具是JDK的基础,用这些工具来编写应用程序。
工具名称 | 用途 |
---|---|
javac | Java语言编译器 |
java | Java应用程序启动器 |
javaw | Java运行工具,用于运行.class字节码文件或.jar文件,但不会显示控制台输出信息,适用于运行图形化程序。 |
javadoc | Java API文档生成器 |
apt | java 注解处理器 「深入Java」Annotation注解 |
appletviewer | java applet小程序查看器 |
jar | java文件压缩打包工具 |
jdb | Java调试器 |
javah | C头文件和stub生成器,用于写本地化方法,例如生产JNI样式的头文件 |
javap | class文件反编译工具 |
extcheck | 用于检测jar包中的问题 |
jcmd | Java命令行(Java Command),用于向正在运行的JVM发送诊断命令请求。 |
安全工具
这些工具用于设置系统的安全规则和生产可以工作在远端的安全规则下的应用程序
工具名称 | 用途 |
---|---|
keytool | 管理密钥库和证书 |
jarsigner | 生产和校验JAR签名 |
policytool | 有用户界面的规则管理工具 |
kinit | 用于获得和缓存网络认证协议Kerberos 票证的授予票证 |
klist | 凭据高速缓存和密钥表中的 Kerberos 显示条目 |
ktab | 密钥和证书管理工具 |
Java国际化工具
这些工具可以帮助你创建可本地化的应用程序
native2ascii
远程方法调用工具
这些工具可以帮助创建可以和web和网络交互的应用程序
工具名称 | 用途 |
---|---|
rmic | 生成远程对象的stubs and skeletons(存根和框架) |
rmid | Java远程方法调用(RMI:Remote Method Invocation)活化系统守护进程 |
rmiregistry | Java远程对象注册表 |
serialver | 返回类的 serialVersionUID |
java-rmi | Java远程方法调用(Java Remote Method Invocation)工具,主要用于在客户机上调用远程服务器上的对象 |
Java IDL and RMI-IIOP 工具
这些工具用于创建使用OMG-Standard IDL 和 CORBA/IIOP 的应用程序
工具名称 | 用途 |
---|---|
tnameserv | Java IDL瞬时命名服 |
idlj | 生产映射到OMG IDL接口可以使Java应用程序使用CORBA的.java文件 |
orbd | 为客户可以在CORBA环境下透明的定位和调用服务器的稳定的对象提供支持 |
servertool | 为应用程序提供易于使用的接口用于注册,注销,启动,关闭服务器 |
Java部署工具
工具名称 | 用途 |
---|---|
pack200 | 使用java gzip压缩工具将JAR文件转换为压缩的pack200文件,生产打包文件是高度压缩的JAR包,可以直接部署,减少下载时间 |
unpack200 | 解包pack200文件为JARs |
Java web工具
工具名称 | 用途 |
---|---|
javaws | Java web 启动命令行工具 |
schemagen | Java构架的XML Schema生成器 |
wsgen | 生成 JAX-WS |
wsimport | 生成 JAX-WS |
xjc | 绑定编译器 |
Java脚本工具
工具名称 | 用途 |
---|---|
jrunscript | 运行脚本 |
其他工具
工具名称 | 用途 |
---|---|
jabswitch | Java Access Bridge Switch的简称,用于控制Java访问桥的开/关。Java访问桥是一种技术,让Java应用程序实现Accessibility API,以供Microsoft Windows系统的辅助技术访问。 |
javafxpackager | JavaFX打包工具 |