赞
踩
JDK自带的性能监控工具
VisualVM等
还有一些第三方的工具
MAT
JProfiler 等
如果各项参数设置合理,系统没有超时日志出现,GC 频率不高,GC 耗时不高,那么没有必要进行 GC 优化,如果 GC 时间超过 1-3 秒,或者频繁 GC,则必须优化
第一步:分析系统运行情况
a、实时监控
可以通过LINUX指令或者JDK指令查看程序运行情况(例如:查看那个进程占用cup比较高)
b、事后分析
所谓事后分析,指已经出现问题,通过GC日志分析(GCEasy等来分析GC情况,了解GC的频率、时间、内存占用等情况)或者堆存储快照分析
第二步:确定jvm调优量化目标
根据分析系统运行情况,明确内存使用率,停顿时间,回收频率等
第三步:确定调优参数
通过压测,调优内存,延迟等指标,对比调优前后差异。重复多次以上步骤。找到合适的参数
cpu飙高原因分析:肯定是存在程序长期占用CPU资源不释放。
1、所以先需要找出那个进程占用CPU高。
top 列出系统各个进程的资源占用情况。
2、然后根据找到对应进行里哪个线程占用CPU高。
top -Hp 进程ID 列出对应进程里面的线程占用资源情况
3、找到对应线程ID后,再打印出对应线程的堆栈信息
jstack PID 打印出进程的所有线程信息,从打印出来的线程信息中找到上一步转换为16进制的线程ID对应的线程信息。
4、最后根据线程的堆栈信息定位到具体业务方法,从代码逻辑中找到问题所在。
查看是否有线程长时间的watting 或blocked,如果线程长期处于watting状态下, 关注watting on xxxxxx,说明线程在等待这把锁,然后根据锁的地址找到持有锁的线程。
分析: 内存飚高如果是发生在java进程上,一般是因为创建了大量对象所导致,持续飚高说明垃圾回收跟不上对象创建的速度,或者内存泄露导致对象无法回收。
1、先观察垃圾回收的情况
如果每次GC次数频繁,而且每次回收的内存空间也正常,那说明是因为对象创建速度快导致内存一直占用很高;如果每次回收的内存非常少,那么很可能是因为内存泄露导致内存一直无法被回收。
2、导出堆内存文件快照
3、使用visualVM对dump文件进行离线分析,找到占用内存高的对象,再找到创建该对象的业务代码位置,从代码和业务场景中定位具体问题。
在jstat命令行工具中可以根据如下的思路来判断是否可能出现了内存泄露,具体思路如下:
运行中的Java程序,运行jstat命令行工具获取JVM运行的数据,重点关注OU值的数据(OU:老年代目前已使用空间)
重复如上的操作,如果OU的值呈上升的趋势,说明Java程序的老年代内存已使用量在不断上涨,那么也就意味着无法回收的对象在不断的增加,很有可能存在内存泄露。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。