一常用工具命令学习
1.Jps 虚拟机进程状况工具
功能:和UNIX PS 命令近似,列出正在运行的虚拟机进程,显示虚拟机运行主类和本地虚拟机唯一进程ID (LVMID)
ex:jps -l
选项 | 作用 |
---|---|
-q | 只输出LVMID,省略主类名称 |
-m | 输出虚拟机启动时传递给主类main()函数参数 |
-l | 输出主类全名,如果进程执行的是jar包,输出jar路径 |
v | 输出虚拟机进程启动的JVM 参数 |
2.jstat 虚拟机统计信息监控工具
功能:监控虚拟机各种运行状态的工具,可以显示本地或者远程的虚拟机进程中的类装载、内存、垃圾收集、JIT编译等数据
jstat vmid interval count
interval 查询间隔 count 查询次数
ex:jstat -gc 19277 500 5
选项 | 作用 |
---|---|
-class | 监控类加载、卸载数量、总空间以及类装载所耗费的时间 |
-gc | 监控java堆情况,包括Eden区,两个survivor区,老年代,永久代等使用量、已用空间和耗时时间 |
-gcutil | 监控内容与-gc基本相同,以百分比的形式标注使用空间和总量 |
-gccause | 与-gcutil功能一致,附带最后一次GC的原因 |
...... |
3.jinfo java配置信息工具
实时查看调整虚拟机各项参数
java -XX:+PrintCommandLineFlags -version
4.jmap java内存映像工具
功能:用于生成堆转储快照(heapdump或dump文件),查询finalize执行队列,Java堆和永久代详细信息(空间使用率,哪种收集器)。
选项 | 作用 |
---|---|
-dump | 生成堆转储快照。格式:-dump:format=b,file=xx |
-finalizerinfo | 显示F-Queue中等待Finalizer线程执行finalize方法的对象 |
-heap | 显示堆详细信息,使用哪种回收期、参数配置、分代情况等 |
-histo | 显示堆中对象统计信息,包括类、实例数量、合计容量 |
-F | -dump没反应,强制生成堆快照 |
jmap -dump:format=b,file=demo.bin 3500
jmap -histo:live 22583 | head -10
5.jhat 堆分析工具 (eclipse的mat更强大)
功能;内置小型HTTP服务,生成dump文件的分析结果可在web页面分析
jhat demo.bin
6:jstack java堆栈跟踪工具
功能:生成当前时刻的线程快照,线程快照是当前虚拟机当前每一条线程执行的方法堆栈集合,生成快照主要为了定为线程执行时间过长的原因。
jstack vmid
选项 | 命令 |
---|---|
-F | 强制输出堆栈信息 |
-l | 除了堆栈,显示关于锁的信息 |
-m | 调用本地方法,可以显示C/C++堆栈 |
二.线上故障案例分析
1.服务器部署若干服务,CPU报警。如何定位CPU过高,内存过载问题
- 找到最高的CPU进程 top -c
3.将线程PID转化为16进制
printf "%x\n" 19755
4.查看堆栈信息
jstack 19277 |grep '4d2b' -C5 --color
2.定位内存溢出,OutOfMemeryError异常问题
模拟内存溢出demo
-verbose:gc -Xms20M -Xmx20M -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/Users/yangtuo/dump
package com.yangtuo.jvm; } |
---|
MAT 分析dump文件 ,对象占用内存比例判断出存在大对象
查看详情
三.JVM 参数调优
-Xms -Xmx -Xmn -Xss
1.尽可能让对象留在年轻代
2.大对象直接进入老年代
-XX:PretenureSizeThreshold 3M 大于这个数直接在老年代分配
3.长期存活对象直接进入老年代
Minor GC后仍然存活并进入suvivor区,每次GC年龄+1
设置GC进入老年代的阀值 -XX:MaxTenuringThreshold=1
默认-XX:MaxTenuringThreshold=15
验证jdk8和jdk7 结果不一致
1.7
1.8 MaxTenuringThreshold=1
1.8 MaxTenuringThreshold=15