一、序言
这里简单介绍了JAVA 应用程序部署linux 服务器上的一些常用监控信息,虽然现在很多自动化监控的东西,但是一些基本的东西,我们还是需要了解。这里是简单记录一下:
二、操作过程
1.我习惯性先看看 CPU 和内存的使用情况,做一个简单的关注
命令:top 可以关注运行状态
命令:大写P:按CPU 使用排序,大写M:按内存使用排序,小写c:详细显示应用
比如A应用出现
VIRT:虚拟内存总共2G,RES:物理已经内存占用:1.8G,并且有持续上升趋势,有可能内存溢出
关于JDK 自带命令,可以参考:http://blog.csdn.net/fenglibing/article/details/6411953
2.jstack -l -pid 查看堆栈信息
当然我习惯性输出到文件:jstack 1234 > jstack_1234.txt
一般我用来分析死锁:看看有什么blocked 之类的,如果有就具体分析对象吧
3.查询内存信息 到文件
jmap -histo > jmap_1234.txt
# 会出现类似的东西,这里里面会出现 对象实例个数大小,含义相信都能看懂 # 如果有溢出危险,可以看看是不是有些不应该存在的对象过多,或者泄露~。~ num #instances #bytes class name ---------------------------------------------- 1: 5639055 314750880 [C 2: 5090750 122178000 java.lang.String 3: 634655 50563800 [B 4: 132871 49959496 com.taobao.api.domain.Trade 5: 535513 30530896 [Ljava.lang.Object; 6: 457581 27420936 [I 7: 421408 23598848 com.taobao.api.domain.MsgList #... # 上面关注的对象,发现订单Trade 占 49959496/8/1024/2024 = 5.95 # 至于合理性,要根据自己系统进行判断,如果是内存不够,需要调大JVM内存 # jmap -histo:live 这是存活的对象 # 当然如果你应用挂了,你可以jmap -dump jmap -head 看下内存快照 # 正常情况不建议这么做,生成快照的时候应用会stop 一下!
4.关注GC信息
jstat -gcutil > jstat_1234.txt
# 会出现类似以下信息 S0 S1 E O P YGC YGCT FGC FGCT GCT 38.69 0.00 90.60 79.89 59.31 150460 1693.925 609 137.180 1831.105 # 我喜欢主要关注FGC 的次数:609 当然这个要配合运行时间去看,你可以5-10分#钟运行几次,看看FGC 的增长率,快了肯定的调节 #当然你还可以观察新生代 、老年代、永久代详细信息,具体参数看上面的链接
小结:
1.虽然很多大部分情况下,公司有运维或者专门的监控工具做这些了,但是了解一下还是有好处的,当然基本的得清楚JVM 的一些分布、原理基础。
2.关于一些常用调优手段,有机会结合实际场景 再分享吧,脱离场景的 都感觉 不太好。
3.也可以用远程的一些工具去操作这些