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的参数

[[email protected] ~]# 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每三行显示一下标题。

[[email protected] ~]# 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号。

[[email protected] ~]# 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

[[email protected] ~]# 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情况

[[email protected] ~]# 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端口

.

时间: 2024-12-06 21:16:49

Java 应用故障排除的相关文章

Java性能故障排除工具

Java性能故障排除工具: 1.jconsole是随着JDK 1.5而推出的.这是一个Java监测和管理控制台-JMX兼容的图形工具来监测Java虚拟机.它能够同时监测本地和远程的JVMs.详情可查看:jconsole工具介绍 2.VisualVM 集成了几个现有的JDK软件工具,轻量级内存和CPU信息概要能力.这个工具被设计为同时在生产和开发时使用,进一步提高监视的能力和Java SE平台的性能分析能力. 3.HeapAnalyzer 能够通过它采用启发式搜索引擎和分析Java堆栈存储信息发现

android 布局页面文件出错故障排除Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V

今天在看布局文件的时候出现 android 布局页面文件出错故障排除Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V 提醒,google后在网上说是因为sdk版本的问题. 解决方法: 修改选择不同的API就好了,降低版本即可

Atitit.故障排除系列---NoClassDefFoundError NoClassDefFoundError

Atitit.故障排除系列---NoClassDefFoundError  NoClassDefFoundError java.lang.ClassNotFoundException找不到类异常.当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常. 还有个NoClassDefFoundError,,是classload 新不上class加载.. 查看class是存在的... 作者:: 老哇的爪子 Attilax 艾龙,  EMAIL:[

atitit.MyEclipse10 中增加svn插件故障排除

atitit.MyEclipse10 中增加svn插件故障排除 删除\configuration \org.eclipse.update 不行... 二. 在configuration下的config.ini文件中org.eclipse.update.reconcile=false改为org.eclipse.update.reconcile=true 为了启动速度, 在插件加载成功后,可以再把它还原成false 韩式不行.... 查看bundles.info,黑头subversion 一瓦韩式c

Atitit.故障排除系列---NoClassDefFoundError&#160;&#160;NoClassDefFoundError&#160;ClassNotFoundException

Atitit.故障排除系列---NoClassDefFoundError  NoClassDefFoundError ClassNotFoundException 1. java.lang.ClassNotFoundException找不到类异常.当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常.1 2. 查看class是存在的...1 3. 把eclipse这个class  添加磊个sysoout  ,,,叫哪重新编译给挂....三

系统启动过程以及故障排除

系统的启动过程 1.加电----CMOS----post(上电自测试程序)----- grub(早期的时候使用的是lilo) Grub的第一阶段主要起到一个引导MBR中的446B.第二阶段在硬盘上,主要是一个配置. 对于任何一种操作系统,任何一台机器,刚开始的时候,肯定是要进行加电的,加完电之后在主板上有一个叫CMOS的芯片,CMOS里面有一个程序,这个程序叫post上电自测试程序.它能够对硬件来完成一些自检,比如,在机器里面内存有多大,CPU是哪一种型号的,声卡.显卡,所以这个叫上电自测试.

Atitit.故障排除系列-----apache 不能启动的排除

Atitit.故障排除系列-----apache 不能启动的排除 能直接使用cli启动httpd   ,,详细打印出信息.. C:\Users\ASIMO>"C:\wamp\apache2\bin\httpd.exe" httpd.exe: Syntax error on line 42 of C:/wamp/Apache2/conf/httpd.conf: ServerRoo t must be a valid directory 作者:: 老哇的爪子 Attilax 艾龙, 

Atitit.故障排除系列---php 程序网站数据库错误排除流程

Atitit.故障排除系列---php 程序网站数据库错误排除流程 Php页面报告的错误不能定位到myusql的db配置上...字说是db conn err Mysql 接入错误...大概查看哈能不能行上配置文件..三,心不死,子能trace兰... 作者::老哇的爪子Attilax艾龙,EMAIL:[email protected] 转载请注明来源: http://blog.csdn.net/attilax Index.php error_reporting(E_ALL  ); 中间,走不个c

在制品和成本故障排除常用脚本

1. 待定在制品物料事务处理? 这些脚本只是Oracle支持服务提供以故障排除为目的.  这些脚本已经过测试且照预计方式运作.然而,在依靠任何脚本之前,你应该始终先进行测试. 请运行这些脚本之前之前先进行校对! 由于不同方式的文件编辑器,电子邮件软件包和操作系统处理文本格式(空格,制表符和回车符),当你第一次收到他们时,这些脚本可能在一个无法执行状态. 检查一下这个脚本,以确保这种类型的错误得到纠正. 首先检查库存事务处理管理器是否运行,如果有任何待定或错误记录在列表中的事务处理界面.  这些都