一常用工具命令学习

1.Jps 虚拟机进程状况工具

功能:和UNIXPS 命令近似,列出正在运行的虚拟机进程,显示虚拟机运行主类和本地虚拟机唯一进程ID (LVMID)

ex:jps -l

java 监控服务器内存CPU 负载情况 java内存监控工具_java

选项作用

-q

只输出LVMID,省略主类名称

-m

输出虚拟机启动时传递给主类main()函数参数

-l

输出主类全名,如果进程执行的是jar包,输出jar路径

v

输出虚拟机进程启动的JVM 参数

2.jstat 虚拟机统计信息监控工具

功能:监控虚拟机各种运行状态的工具,可以显示本地或者远程的虚拟机进程中的类装载、内存、垃圾收集、JIT编译等数据

jstat vmid interval count

interval 查询间隔 count 查询次数

ex:jstat -gc 19277 500 5

java 监控服务器内存CPU 负载情况 java内存监控工具_堆栈_02

选项作用

-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
如上图,最耗CPU的进程PID为19277
2.找到最耗CPU线程 top -Hp 19277
键入P 排序
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;
import java.util.ArrayList;
import java.util.List;
public class HeapOOM {
static class OOMObject{
}
public static void main(String args[]) {
List list = new ArrayList();
try {
Thread.sleep(20000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
while (true){
list.add(new OOMObject());
}
}
}

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

java 监控服务器内存CPU 负载情况 java内存监控工具_java 监控工具_03

java 监控服务器内存CPU 负载情况 java内存监控工具_堆栈_04

1.8 MaxTenuringThreshold=1

java 监控服务器内存CPU 负载情况 java内存监控工具_java 监控工具_05

1.8 MaxTenuringThreshold=15

java 监控服务器内存CPU 负载情况 java内存监控工具_java_06