- jps 查看进程 id
- Jmap 查看内存信息,实例个数以及占用内存大小
jmap -histo pid
jmap ‐dump:format=b,file=eureka.hprof 14660
- Jstack 查找死锁
jstack 19663 | grep -A 10 4cd0
- 需要把 top 里的 tid 转为十六进制
- Jinfo 查看正在运行的Java应用程序的扩展参数
- Jstat 查看堆内存各部分的使用量,以及加载类的数量
- jstat -gcutil pid
- jstat -gc pid 垃圾回收统计
- 年轻代对象增长的速率
- Young GC的触发频率和每次耗时
- 每次 Young GC 后有多少对象存活和进入老年代
- Full GC 的触发频率和每次耗时
- jstat -gccapacity pid 堆内存统计
- jstat -gcnew pid 新生代垃圾回收统计
- jstat -gcnewcapacity pid 新生代内存统计
- jstat -gcold pid 老年代垃圾回收统计
- jstat -gcoldcapacity pid 老年代内存统计
- jstat -gcmetacapacity 元数据空间统计
- jvisualvm
- Arthas:dashboard;thread;ognl
- 内存溢出自动导出dump文件:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./
- GC日志:
‐XX:+PrintGCDetails
java -XX:+PrintFlagsInitial
表示打印出所有参数选项的默认值java -XX:+PrintFlagsFinal
表示打印出所有参数选项在运行程序时生效的值
- 优化思路:尽量让每次Young GC后的存活对象小于Survivor区域的50%,都留存在年轻代里。尽量别让对象进入老年代。尽量减少Full GC的频率,避免频繁Full GC对JVM性能的影响
- 系统频繁Full GC导致系统卡顿:结合对象挪动到老年代那些规则推理下程序可能存在的一些问题
- 尤其是对象动态年龄判断机制:把年轻代适当调大点
- 老年代空间分配担保机制
- 大对象问题:jmap -histo pid 找出大对象(结合cpu占用较高的线程),然后优化代码
- 内存泄露
- 一些老旧数据没有及时清理导致一直占用内存,时间长了除了导致 full gc,还有可能导致 OOM
- hashmap存放缓存数据而没设置淘汰算法
- 一些老旧数据没有及时清理导致一直占用内存,时间长了除了导致 full gc,还有可能导致 OOM