首页 > 代码库 > Java 应用故障排除
Java 应用故障排除
对于在线用户来说,常常因为流量过高,程序bug,依赖故障,线程死锁,配置错误等导致系统不用下面介绍一些常用Java故障工具排除问题。
一、常用工具:
JDK 自身提供了一系列的Java故障排除工具,虽然简单,但是十分有用。
1,jps
jps用来输出一些JVM虚拟机的进程信息,类似于Linux的ps命令, ,它的作用是显示当前系统的java进程情况,及其id号。我们可以通过它来查看我们到底启动了几个java进程(因为每一个java程序都会独占一个java虚拟机实例),和他们的进程号(为下面几个程序做准备),并可通过opt来查看这些进程的详细启动参数。
jps的用法:
-q :只显示pid,不显示class名称,jar文件名和传递给 main 方法的参数
-m :输出进程启动时候传递给main函数的参数
-l :输出应用程序main class的完整package名或者应用程序的jar文件完整路径名
-v:输出传递给JVM的参数
[root@localhost ~]# jps -v
30319 Bootstrap -Djava.util.logging.config.file=/usr/local/webserver/apache-tomcat-cms
注:jps命令似乎只能显示当前用户的java进程,要显示其他用户的还是只能用unix/linux的ps命令
2、jstat
jstat是一个可以用来对虚拟机各站运行状态进行监控的工具,,通过它可以看到虚拟机的类加载,与卸载,管理内存使用和垃圾收集信息,监视JIT及时编译器的运行情况。一般是运行期定位问题的首选
jstat的用法:
jstat -class pid:显示加载class的数量,及所占空间等信息。
jstat -compiler pid:显示VM实时编译的数量等信息。
jstat -gc pid:可以显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。
jstat -gccapacity:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其他的可以根据这个类推, OC是old内纯的占用量。
jstat -gcnew pid:new对象的信息。
jstat -gcnewcapacity pid:new对象的信息及其占用量。
jstat -gcold pid:old对象的信息。
jstat -gcoldcapacity pid:old对象的信息及其占用量。
jstat -gcpermcapacity pid: perm对象的信息及其占用量。
jstat -util pid:统计gc信息统计。
jstat -printcompilation pid:当前VM执行的信息。
除了以上一个参数外,还可以同时加上 两个数字,如:jstat -printcompilation 3024 250 6是每250毫秒打印一次,一共打印6次,还可以加上-h3每三行显示一下标题。
[root@localhost ~]# jstat -class 32388(pid)
Loaded Bytes Unloaded Bytes Time
9012 18808.3 191 301.6 54.46
3.jinfo
用于查看应用程序的配置参数,以及打印运行jvm时所指定的jvm参数。
观察运行中的java程序的运行环境参数:参数包括Java System属性和JVM命令行参数
实例:jinfo 2083
其中2083就是java进程id号,可以用jps得到这个id号。
[root@localhost ~]# jinfo (-flags) 30823 (id)
Attaching to process ID 30823, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 23.1-b03
jstack:
可以观察到jvm中当前所有线程的运行情况和线程当前状态
用来生产虚拟机当前的线程快照信息,线程快照信息是当前虚拟机每一个线程正在执行的方法堆栈的集合,生产线程快照的目的是主要是为了定位线程长时间没有响应的原因,如,线程死锁,网络请求.
ms/temp
[root@localhost ~]# jstack 30823
2014-11-14 17:52:57
Full thread dump Java HotSpot(TM) 64-Bit Server VM (23.1-b03 mixed mode):
"Attach Listener" daemon prio=10 tid=0x00007f91e0001800 nid=0x77e waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"MultiThreadedHttpConnectionManager cleanup" daemon prio=10 tid=0x00007f919814f000 nid=0x7907 in Object.wait() [0x00007f9210e4f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
- locked <0x00000007037c9800> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$ReferenceQueueThread.run(MultiThreadedHttpConnectionManager.java:1122)
.
.jmap:
可以查看等待回收对象的队列,查看堆的概要信息,以及通过JVM参数指定各内存的空间大小,通过jvm堆快照转储快照,可以查找内存泄露等问题。
-heap:打印jvm heap的情况
-histo:打印jvm heap的直方图。其输出信息包括类名,对象数量,对象占用大小。
-histo:live :同上,但是只答应存活对象的情况
-permstat:打印permanent generation heap情况
[root@localhost ~]# jmap -heap 30823
Attaching to process ID 30823, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 23.1-b03
using thread-local object allocation.
Parallel GC with 4 thread(s)
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 4294967296 (4096.0MB)
NewSize = 1310720 (1.25MB)
MaxNewSize = 17592186044415 MB
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 536870912 (512.0MB)
MaxPermSize = 536870912 (512.0MB)
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 1267531776 (1208.8125MB)
used = 623225224 (594.353889465332MB)
free = 644306552 (614.458610534668MB)
49.16841027581466% used
From Space:
capacity = 83034112 (79.1875MB)
used = 38528120 (36.74327850341797MB)
free = 44505992 (42.44422149658203MB)
46.40035170123816% used
To Space:
capacity = 81068032 (77.3125MB)
used = 0 (0.0MB)
free = 81068032 (77.3125MB)
0.0% used
PS Old Generation
capacity = 2863333376 (2730.6875MB)
used = 166141280 (158.44467163085938MB)
free = 2697192096 (2572.2428283691406MB)
5.802372905389554% used
PS Perm Generation
capacity = 536870912 (512.0MB)
used = 77216208 (73.63911437988281MB)
free = 459654704 (438.3608856201172MB)
14.382639527320862% used
39090 interned Strings occupying 4328232 bytes.
BTrace:
开源的一个Java动态跟踪工具,工作原理是根据hotspot虚拟机的hotswap技术将跟踪的代码动态替换带被跟踪的Java程序内
单来说,就是能在不改动当前程序的情况下,运行时的去监控Java程序的执行状况,例如可以做到内存状况的监控、方法调用的监控等等。
用法:
btrace:
pid : 需要跟踪的Java进程id
-cp--classpath 用来编译指定所需路径,一般指btrace-client.jar
-p:port,指定btrace agent端口
.
本文出自 “crazy_sir” 博客,请务必保留此出处http://douya.blog.51cto.com/6173221/1576605
Java 应用故障排除