编程工具介绍及常见故障诊断

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/njpjsoftdev/article/details/52130425

作者:欧永广 张雁 朴星海


一、   编程环境及编程工具

1.        eclipse插件介绍

I.CheckStyle:CheckStyle 可以协助寻找那些可影响到可维护性、与编码标准相冲突的地方,比方说,过大的类、太长的方法和未使用的变量等等。

II.EclEmma:EclEmma 就是这样一个能帮助开发人员考察测试覆盖率的优秀的 Eclipse 开源插件。EclEmma 在覆盖测试领域是如此的优秀,以致于它在过去不久的 2006 年成为了Eclipse Community Awards Winners 决赛选手。

III.FindBugs:FindBugs是开源项目当中的一个,它可以帮你找到代码中隐藏的一些错误,提升你的代码能力与系统安全可靠性。

二、   故障诊断工具类和方法

I.基本诊断工具

1、top 命令

功能:显示当前linux系统中正在运行的服务及资源使用情况

格式:top [option] pid [,pid ...]

找出哪个进程消耗cpu或内存高,然后使用 top -p pid只查看指定进程的资源使用情况,按下shift+h,只显示该进程的所有线程信息,用于判断某个模块是否出现内存泄露、线程死锁及锁争用(Lock Contention)等情况,结合下面的工具工具进行进一步定位

2、jps(JavaVirtual Machine Process Status Tool)命令

功能:主要用来输出JVM中运行的进程状态信息

格式:jps [options] [hostid]

-q 不输出类名、Jar名和传入main方法的参数

-m 输出传入main方法的参数

-l 输出main类或Jar的全限名

-v 输出传入JVM的参数

当知道某个进程号,需要确认该进程号属于哪个模块时,可以用此命令查看模块名、启动参数及其它运行参数

3、jstack命令

功能:用于查看模块的各个线程运行状态、堆栈状态

格式:jstack [option] pid

jstack [option] executable core

      -l  long listings,打印出额外的锁信息,在发生死锁时可以用jstack -l pid来观察锁持有情况

-m  mixed mode,不仅会输出Java堆栈信息,还会输出C/C++堆栈信息(比如Native方法)

说明:jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,它在JVM性能调优中使用得非常多。

如果某个进程长期占用CPU比率为100%或接近100%,可使用该命令查看各个线程状态。如果某个线程总是处于LOCKED或WAITING状态,则要确认等待或锁定的是否是自己定义的共享资源(例如自定义的任务队列),看看是否有死锁的情况发生。

4、jmap(MemoryMap)和jhat(Java Heap Analysis Tool)

功能:进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况

格式:jmap [option] pid (如果带上live则只统计活对象)

      -heap 打印堆栈的统计信息

-histo 打印模块的历史java对象堆栈统计信息,如果加上:live参数,则只打印当前活动的对象的堆栈信息

-permstat 打印进程的类加载器和类加载器加载的持久代对象信息,输出:类加载器名称、对象是否存活(不可靠)、对象地址、父类加载器、已加载的类大小等信息

-finalizerinfo

-dump:<dump-options>还有一个很常用的情况是:用jmap把进程内存使用情况dump到文件中,再用jhat分析查看。jmap进行dump命令格式如下:

jmap -dump:format=b,file=dumpFileName

然后使用jhat查看,jhat -port 9998 dumpFileName,此时可以在浏览器中输入主机地址:9998查看了

5、jstat(JVM统计监测工具)

功能: JVM统计监测

格式:jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]

说明:vmid是虚拟机ID,在Linux/Unix系统上一般就是进程ID。interval是采样时间间隔。count是采样数目。

JVM堆内存布局

由上图可知,

堆内存 = 年轻代 + 年老代 + 永久代

年轻代 = Eden区 + 两个Survivor区(From和To)

举个例子:


各列的含义:

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总耗时


猜你喜欢

转载自blog.csdn.net/njpjsoftdev/article/details/52130425
今日推荐