[转帖]java性能监控处理工具 java性能监控处理工具

https://www.cnblogs.com/starjava/p/8674545.html

一常用工具命令学习

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过高,内存过载问题

  1. 找到最高的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<OOMObject> list = new ArrayList<OOMObject>();
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

1.8 MaxTenuringThreshold=1

1.8 MaxTenuringThreshold=15

一常用工具命令学习

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过高,内存过载问题

  1. 找到最高的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<OOMObject> list = new ArrayList<OOMObject>();
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

1.8 MaxTenuringThreshold=1

1.8 MaxTenuringThreshold=15

猜你喜欢

转载自www.cnblogs.com/jinanxiaolaohu/p/12084567.html