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_charles 51CTO博客,原文链接:http://blog.51cto.com/douya/1576605,如需转载请自行联系原作者

相关文章
|
3天前
|
安全 Java 调度
Java线程:深入理解与实战应用
Java线程:深入理解与实战应用
20 0
|
1天前
|
安全 Java 大数据
探索Java的奇妙世界:语言特性与实际应用
探索Java的奇妙世界:语言特性与实际应用
|
3天前
|
Java
Java中的并发编程:理解和应用线程池
【4月更文挑战第23天】在现代的Java应用程序中,性能和资源的有效利用已经成为了一个重要的考量因素。并发编程是提高应用程序性能的关键手段之一,而线程池则是实现高效并发的重要工具。本文将深入探讨Java中的线程池,包括其基本原理、优势、以及如何在实际开发中有效地使用线程池。我们将通过实例和代码片段,帮助读者理解线程池的概念,并学习如何在Java应用中合理地使用线程池。
|
8天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
|
8天前
|
设计模式 算法 Java
Java中的设计模式及其应用
【4月更文挑战第18天】本文介绍了Java设计模式的重要性及分类,包括创建型、结构型和行为型模式。创建型模式如单例、工厂方法用于对象创建;结构型模式如适配器、组合关注对象组合;行为型模式如策略、观察者关注对象交互。文中还举例说明了单例模式在配置管理器中的应用,工厂方法在图形编辑器中的使用,以及策略模式在电商折扣计算中的实践。设计模式能提升代码可读性、可维护性和可扩展性,是Java开发者的必备知识。
|
8天前
|
安全 Java API
函数式编程在Java中的应用
【4月更文挑战第18天】本文介绍了函数式编程的核心概念,包括不可变性、纯函数、高阶函数和函数组合,并展示了Java 8如何通过Lambda表达式、Stream API、Optional类和函数式接口支持函数式编程。通过实际应用案例,阐述了函数式编程在集合处理、并发编程和错误处理中的应用。结论指出,函数式编程能提升Java代码的质量和可维护性,随着Java语言的演进,函数式特性将更加丰富。
|
9天前
|
Java API 数据库
深入解析:使用JPA进行Java对象关系映射的实践与应用
【4月更文挑战第17天】Java Persistence API (JPA) 是Java EE中的ORM规范,简化数据库操作,让开发者以面向对象方式处理数据,提高效率和代码可读性。它定义了Java对象与数据库表的映射,通过@Entity等注解标记实体类,如User类映射到users表。JPA提供持久化上下文和EntityManager,管理对象生命周期,支持Criteria API和JPQL进行数据库查询。同时,JPA包含事务管理功能,保证数据一致性。使用JPA能降低开发复杂性,但需根据项目需求灵活应用,结合框架如Spring Data JPA,进一步提升开发便捷性。
|
13天前
|
Java
探秘jstack:解决Java应用线程问题的利器
探秘jstack:解决Java应用线程问题的利器
17 1
探秘jstack:解决Java应用线程问题的利器
|
17天前
|
XML JSON JavaScript
Java中XML和JSON的比较与应用指南
本文对比了Java中XML和JSON的使用,XML以自我描述性和可扩展性著称,适合结构复杂、需验证的场景,但语法冗长。JSON结构简洁,适用于轻量级数据交换,但不支持命名空间。在Java中,处理XML可使用DOM、SAX解析器或XPath,而JSON可借助GSON、Jackson库。根据需求选择合适格式,注意安全、性能和可读性。
26 0
|
22天前
|
存储 安全 Java
Spring Security应用讲解(Java案列演示)
Spring Security应用讲解(Java案列演示)