3.虚拟机性能监控与故障处理工具

JDK命令

以下介绍的JDK命令主要是处理应用程序性能问题、定位程序故障等情况。

JDK监控和故障处理工具

名称 主要作用
jps 显示指定系统内所有的HotSpot虚拟机进程
jstat 收集HotSpot虚拟机各方面的运行数据
jinfo 显示虚拟机配置信息
jmap 生成虚拟机的内存转储快照(heapdump文件)
jhat 分析heapdump文件,会建立一个HTTP/HTML服务器,让用户可以在浏览器查看分析结果
jstack 显示细腻的线程快照

jps:虚拟机进程状况工具

JVM Process Status Tool,显示指定系统内所有的虚拟机进程。列出正在运行的细腻及进程,并显示虚拟机执行主类以及这些进程的本地虚拟机唯一ID。类似ps。

-q:只输出进程 ID
-m:输出传入 main 方法的参数
-l:输出完全的包名,应用主类名,jar的完全路径名
-v:输出jvm参数
-V:输出通过flag文件传递到JVM中的参数

jps

与ps区别:启动多个虚拟机进程时,无法根据进程名称定位时,只能依赖jps命令显示主类的功能区分。

jstat:虚拟机统计信息监视工具

JVM Statistics Monitoring Tool,用于收集虚拟机各方面的运行数据。可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。

-class 显示ClassLoad的相关信息;
-compiler 显示JIT编译的相关信息;
-gc 显示和gc相关的堆信息;
-gccapacity 显示各个代的容量以及使用情况;
-gcmetacapacity 显示metaspace的大小
-gcnew 显示新生代信息;
-gcnewcapacity 显示新生代大小和使用情况;
-gcold 显示老年代和永久代的信息;
-gcoldcapacity 显示老年代的大小;
-gcutil 显示垃圾收集信息;
-gccause 显示垃圾回收的相关信息(通-gcutil),同时显示最后一次或当前正在发生的垃圾回收的诱因;
-printcompilation 输出JIT编译的方法信息;

解析:jstat -gc 13504 2000 20(每隔2秒监控一次,共做10次)

名称 主要作用
S0C,S1C survivor space 幸存区0,1当前空间大小
S0U,S1U survivor space 幸存区0,1使用空间大小
EC Eden space 伊甸园当前空间大小
EU Eden space 伊甸园使用空间大小
OC Old space老年代当前空间大小
OU Old space老年代使用空间大小
MC Metaspace 元空间总空间大小
MU Metaspace 元空间使用空间大小
CCSC 压缩类空间大小
CCSU 压缩类空间使用大小
YGC YoungGC年轻代垃圾回收次数
YGCT YoungGC年轻代垃圾回收时间
FGC FullGC老年代垃圾回收次数
FGCT FullGC老年代垃圾回收时间
GCT 全部GC时间

jstat参数解析参考:https://blog.csdn.net/maosijunzi/article/details/46049117

jinfo:java配置信息工具

Configuration Info for Java,显示虚拟机配置信息。可以实时查看虚拟机的相关配置信息。

no option 输出全部的参数和系统属性
-flag name 输出对应名称的参数
-flag [+|-]name 开启或者关闭对应名称的参数
-flag name=value 设定对应名称的参数
-flags 输出全部的参数
-sysprops 输出系统属性

eg:jinfo -flags pid 描述:输出全部的参数

jmap:java内存映射工具

Memory Map for Java,生成虚拟机的内存转储快照(heapdump或dump文件)。还可以查询finalize执行队列,java堆和永久带的详细信息,如空间使用率,当前使用的哪种收集器等等。

-heap: 显示Java堆详细信息
-histo[:live]: 显示堆中对象的统计信息
-finalizerinfo: 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
-dump:<dump-options>:生成堆转储快照
-F:当-dump没有响应时,使用-dump或者-histo参数. 在这个模式下,live子参数无效.

eg1: jmap -heap 16840堆信息

eg2: jmap -dump:format=b,file=aa.bin 57524

jhat:虚拟机堆转储快照分析工具

JVM Heap Dump Browser,用于分析heapdump文件,建立一个Http/HTML服务器,查看分析结果。与jmap搭配使用,分析jmap生成的快照。

eg: jhat aa.bin

访问:http://localhost:7000/ 即可看到当时的快照信息,默认以包为单位显示,不常使用不做具体分析。

jstack:java堆栈跟踪工具

Stack Trace for Java,jstack是jdk自带的线程堆栈分析工具,使用该命令可以查看或导出 Java 应用程序中线程堆栈信息。用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件)。线程快照就是当前虚拟机每一条线程正在执行的方法堆栈的集合,生成的线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁,死循环,请求外部资源导致的长时间等待等等。

-l 长列表. 打印关于锁的附加信息,例如属于java.util.concurrent 的 ownable synchronizers列表.
-F 当’jstack [-l] pid’没有相应的时候强制打印栈信息
-m 打印java和native c/c++框架的所有栈信息.
-h | -help 打印帮助信息
jstack -F pid >> a.log

可以用其来检查死锁。线程1与线程2都只进行加锁操作,不进行释放锁。此时发生死锁现象。

        ReentrantLock lock1 = new ReentrantLock();
        ReentrantLock lock2 = new ReentrantLock();

        Thread t1 = new Thread(() -> {
            lock1.lock();
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (Exception e) {}
            lock2.lock();
        });

        Thread t2 = new Thread(() -> {
            lock1.lock();
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (Exception e) {}
            lock2.lock();
        });
        t1.start();
        t2.start();

JDK可视化工具

若当真排查问题使用命令行,那选择放弃可以不?不过,好在JDK提供了两个功能强大的可视化工具(JConsole,JVisualVM),其中JVisualVM现已成为Oracle主力推动的多合一故障处理工具,兼容JConsole。

jconsole

Jconsole (Java Monitoring and Management Console),一种基于JMX的可视化监视、管理工具。包括以下基本功能:概述、内存、线程、类、VM概要、MBean... ...


jvisualVM

VisualVM 已在JDK6.0 update 7 中自带(java启动时不需要特定参数,监控工具在bin/jvisualvm.exe),能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。

使用jvisualVM要做到什么:出现OOM或者内存泄漏后,可以使用它定位到具体的代码。

使用介绍:安装插件


插件

简单介绍

1.基本信息

2.heapdump 对应命令jmap

heapdump

2.threaddump对应命令jstack

threaddump

问题思考:
线上如何监控内存,cpu情况?
线上如何定位OOM问题,如果是偶发,无规律,即不能通过jvisualVM监控。

生产实战演示

见我的另一篇文章生产内存溢出问题

BTrace:动态日志跟踪

BTrace是一个安全的JVM动态追踪工具,典型的使用场景是,“我要查个问题,可那个方法没有打印入口参数和返回结果日志”,“我想看某个方法的执行耗时”,“我想查看某方法如System.GC()的调用栈”等等,这些都是BTrace可以小试牛刀的地方。它的优势是,直接attach应用JVM,不用重启应用进程,可比较快速方便地定位问题。

/* BTrace Script Template */
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;
import com.sun.btrace.BTraceUtils;
@BTrace(unsafe = true)// 表示这是一个BTrace跟踪脚本,并启用unsafe模式(因为使用了BTraceUtils以外的方法,即String.valueOf(obj))
public class TracingScript {
   
 @OnMethod(clazz="com.example.demo.web.UserController", //类的全名
       method="login",// 方法名
       location=@Location(Kind.RETURN))// 表示跟踪某个类的某个方法,位置为方法返回处
   
    public static void test(@Self com.example.demo.web.UserController self,  
           com.example.demo.constant.UserVo userVo,@Return String result) {
       println("test start!");
       jstack();
       println(self);
       println(String.valueOf(userVo)) ;
       println(result);
       println("test end!");
   }
}

结果:

btrace
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,639评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,093评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,079评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,329评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,343评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,047评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,645评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,565评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,095评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,201评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,338评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,014评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,701评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,194评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,320评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,685评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,345评论 2 358

推荐阅读更多精彩内容