前几篇我 们学习了,JVM里面的运行结构,GC算法,以及各种垃圾收集器的优劣点,那么本篇我们来看下如何使用一些虚拟机性能监控工具,来监控和快速处理故障,当 JVM出现一些故障时,我们通常从如下的几个方面进行着手分析,包括运行日志,异常堆栈,GC日志,线程快照(threaddump/javacore文 件),堆转储快照(heapdump/hprof文件),熟练掌握这些工具,可以帮我们更好更快弄清或解决一些难易解决的复杂问题。
下面看下SUN JDK自带的几款故障定位工具:
序号 | 名称 | 描述 |
1 | jps | JVM Process Status Tool ,显示指定系统内所有的HotSpot虚拟机进程 |
2 | jstat | 用于收集hotspot虚拟机各方面的运行数据 |
3 | jinfo | 显示虚拟机配置信息 |
4 | jmap | 生成虚拟机的内存转储快照 |
5 | jhat | 分析heap文件,它会建立一个http/html服务,让用户可以通过浏览器查看分析结果 |
6 | jstack | 显示虚拟机的线程快照 |
1,jps命令几个参数如下:
-q,只输出LVMID省略主类的名称
-m,输出虚拟机进程启动时,传递给主类的main函数的参数
-l,输出主类的全名,如果进程执行的是jar包,输出jar路径
-v,输出虚拟机启动时的JVM参数
2,jstat,虚拟机统计信息监视工具
命令格式,jstat vmid interval count,如果是远程机器,可以加上机器名和IP地址进行访问。
一个示例: jstat -gc 2764 250 20
选项option代表用户需要查询的虚拟机的信息,主要分为3类:类装载、垃圾回收和运行期的编译情况,具体如下表所示:
Option Function
-class 监视类的装载、卸载数量以及类的装载总空间和耗费时间等
-gc 监视Java堆,包含eden、2个survivor区、old区和永久带区域的容量、已用空间、GC时间合计等信息
-gccapcity 监视内容与-gc相同,但输出主要关注Java区域用到的最大和最小空间
-gcutil 监视内容与-gc相同,但输出主要关注已使用空间占总空间的百分比
-gccause 与-gcutil输出信息相同,额外输出导致上次GC产生的原因
-gcnew 监控新生代的GC情况
-gcnewcapacity 与-gcnew监控信息相同,输出主要关注使用到的最大和最小空间
-gcold 监控老生代的GC情况
-gcoldcapacity 与-gcold监控信息相同,输出主要关注使用到的最大和最小空间
-gcpermcapacity 输出永久带用到的最大和最小空间
-compiler 输出JIT编译器编译过的方法、耗时信息
-printcompilation 输出已经被JIT编译的方法
另外,使用jstat -gcutil 2764,比较常用的监控命令:
- [search@fsedump00yw ~]$ jstat -gcutil 7829
- S0 S1 E O P YGC YGCT FGC FGCT GCT
- 0.02 0.00 100.00 96.31 99.94 6504 53.595 9 12.097 65.692
- [search@fsedump00yw ~]$ jstat -gcutil 7829
- S0 S1 E O P YGC YGCT FGC FGCT GCT
- 0.00 0.09 6.05 96.31 99.94 6505 53.598 9 12.097 65.696
- [search@fsedump00yw ~]$
参数介绍:
E代表Eden,新生代区,两个survivor区,S0和S1,,老年代使用O来表示,永久带使用P表示,YGC(Minor GC) FULL FGC, FGCT代表FUCC GC耗时,GCT代表总的GC时间。
3,jinfo:实时查看虚拟机调整的各项参数
用法: jinfo option pid
4,jmap,JAVA内存影像工具
用法:jmap [option ] vmid
Option的信息如下表所示
Option Function
-dump 生成对应的dump信息,用法为-dump:[live,]format=b,file={fileName}
-finalizerinfo 显示在F-Queue中等待的Finalizer方法的对象(只在linux下生效)
-heap 显示堆的详细信息、垃圾回收器信息、参数配置、分代详情等
-histo 显示堆栈中的对象的统计信息,包含类、实例数量和合计容量
-permstat 以ClassLoder为统计口径显示永久带的内存状态
-F 当虚拟机对-dump无响应时可使用这个选项强制生成dump快照
示例:jmap -dump:format=b,file=heap.dump 20445
5,jhat ,虚拟机堆转储快照分析工具
hat是用来分析dump文件的一个微型的HTTP/HTML服务器,它能将生成的dump文件生成在线的HTML文件,让我们可以通过浏览器进 行查阅,然而实际中我们很少使用这个工具,因为一般服务器上设置的堆、栈内存都比较大,生成的dump也比较大,直接用jhat容易造成内存溢出,而是我 们大部分会将对应的文件拷贝下来,通过其他可视化的工具进行分析。启用法如下:
jhat {dump_file}
6,jstack JAVA堆栈跟踪工具:
stack用于JVM当前时刻的线程快照,又称threaddump文件,它是JVM当前每一条线程正在执行的堆栈信息的集合。生成线程快照的主 要目的是为了定位线程出现长时间停顿的原因,如线程死锁、死循环、请求外部时长过长导致线程停顿的原因。通过jstack我们就可以知道哪些进程在后台做 些什么?在等待什么资源等!其运行格式如下:
jstack [option] vmid
相关的option和function如下表所示
Option Function
-F 当正常输出的请求不响应时强制输出线程堆栈
-l 除堆栈信息外,显示关于锁的附加信息
-m 显示native方法的堆栈信息
示例:jstack -l 20445
上面说的都是基于命令行的的JVM指令的一些分析,下面看一下可视化的强大的工具.
1,jconsole,
启动命令:cmd里输入jconsole(配置好JDK环境变量的前提下)
JConsole是一个基于JMX的GUI工具,用于连接正在运行的JVM,不过此JVM需要使用可管理的模式启动,我们可以直接在命令行cmd里面启动,它主要监控内存,类,线程和VM信息,界面如下:
2,jvisualvm工具,
在cmd里输入jvisualvm命令启动。
VisualVM 是Netbeans的profile子项目,已在JDK6.0 update 7 中自带(java启动时不需要特定参数,监控工具在bin/jvisualvm.exe),能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。
在JDK_HOME/bin(默认是C:\Program Files\Java\jdk1.6.0_13\bin)目录下面,有一个jvisualvm.exe文件,双击打开,从UI上来看,这个软件是基于NetBeans开发的了。
截图如下:
相关推荐
深入Java虚拟机JVM类加载学习笔记:jvm java classloader 垃圾回收 gc
Java虚拟机JVM类加载学习笔记
JVM 学习笔记(Java虚拟机)
它采用了“一次编写,到处运行”的原则,即一次编写的程序可以在不同的操作系统上运行,这得益于Java虚拟机(JVM)的存在。JVM是Java的核心组成部分,它可以将Java代码解释成特定平台上的机器码,从而实现跨平台运行...
自己有个习惯,学习新的知识喜欢一边看一边写笔记,这个是学习java虚拟机的时候写的笔记。
JVM深入理解Java虚拟机 - 学习笔记
包括jvm 的内存模型 对象的创建过程 垃圾回收算法 垃圾回收器 内存分配和回收策略
比较全面学习笔记文档,初学Java虚拟机建议下来看看
JVM是Java Virtual Machine(Java虚拟机)的缩写,是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟计算机功能来实现的,JVM屏蔽了与具体操作系统平台相关的信息,Java程序只需生成在Java虚拟机上运行的字节...
Java分布式应用学习笔记02再谈JVM
java虚拟机源码学习 Understanding the JVM 深入理解Java虚拟机第三版 (周志明)源码及学习笔记
《JVM必知必会》记录了对JVM的总结及学习笔记,详解的介绍了什么是jvm,以及弄清楚jvm的工作原理等等,会深入了解JVM有一定的帮助。 Java Virtual Machine(Java虚拟机),它bai是一个虚构出来du的计算机,是通过在...
Java基础学习笔记(印象笔记) Java 是一种广泛使用的面向对象编程语言,最初由 Sun Microsystems(现为 Oracle Corporation)于1995年发布。它具有简单、易学、可移植、安全和高性能等特点。 Java 是一种跨平台语言...
本文来自于cnblogs,为什么要学习Java虚拟机?它能干什么,文章从作者得角度带大家深入Java虚拟机相关内容,希望对大家有帮助。这里我们使用举例来说明为什么要学习Java虚拟机,其实这个问题就和为什么要学习数据结构...
它采用了“一次编写,到处运行”的原则,即一次编写的程序可以在不同的操作系统上运行,这得益于Java虚拟机(JVM)的存在。JVM是Java的核心组成部分,它可以将Java代码解释成特定平台上的机器码,从而实现跨平台运行...
Java虚拟机(JVM):内存管理、垃圾回收、性能调优。 个人项目实践:结合作者经验,分享项目开发中的心得和技巧。 适用人群 Java初学者:希望从零开始学习Java编程的新手。 在校大学生:计算机科学或相关专业,需要...
它采用了“一次编写,到处运行”的原则,即一次编写的程序可以在不同的操作系统上运行,这得益于Java虚拟机(JVM)的存在。JVM是Java的核心组成部分,它可以将Java代码解释成特定平台上的机器码,从而实现跨平台运行...
title: 黑马JVM学习笔记二 date: 2020-01-13 1:00:00 tags: JVM categories: JVM 黑马jvm 内存结构 内存结构总览图: 程序计数器 1.定义:Program Counter Register 程序计数器 (寄存器) 程序计数器是Java对物理...
java7 rt.jar源码 Java_JVM This is my Java JVM learn notes ...java虚拟机 一:上篇——内存与垃圾回收器 二:中篇——字节码与类的加载 ...主要的三款商用虚拟机JVM: 1) HotSpot JVM 特点: 热点代码探索
它采用了“一次编写,到处运行”的原则,即一次编写的程序可以在不同的操作系统上运行,这得益于Java虚拟机(JVM)的存在。JVM是Java的核心组成部分,它可以将Java代码解释成特定平台上的机器码,从而实现跨平台运行...