作者:欧永广 张雁 朴星海
一、 编程环境及编程工具
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总耗时 |