善于利用工具,不仅可以加快我们分析数据,还可以快速定位和解决问题。现在我们就来看看虚拟机性能监控和故障处理工具。

在JDK的bin目录可以看到sun免费送给了我们很多小工具,这些工具虽然小巧但功能强大且稳定,你看到的小工具其实是lib\tools.jar的快捷方式而已,工具的具体执行是被打包进了tools.jar了。

jps:虚拟机进程状态工具(JVM Process Status Tool)

jps不仅名字像unix的ps命令,其功能与ps也很类似:列出正在运行的虚拟机进程,并显示虚拟机执行主类(main()所在的类)的名字,以及这些进程再本地虚拟机的唯一ID(LVMID,Local Virtual Machine Identifier)。而LVMID和操作下图的PID(Process Identifier)是一致的。如果同时启动了多个虚拟机进程,无法根据进程名称定位时,那就只能依赖jps命令显示主类的功能区分了。命令格式:

usage: jps [-help]
jps [-q] [-mlvV] [<hostid>] Definitions:
<hostid>: <hostname>[:<port>]
  • -q 仅输出LVMID,省略主类的名称;
  • -m 输出虚拟机进程启动时传递给主类main()函数的参数;
  • -l 输出主类的全名,如果进程执行的是jar包,则输出jar的路径;
  • -v 输出虚拟机进程启动时JVM参数;
  • -V 输出通过flag文件传递到JVM中的参数;
  • -Joption 传递参数到JVM,例如:-J-Xms48m;

hostid的格式是:<hostname>[:<port>],port默认是1099,需要服务器启动jstatd服务,否则会提示

RMI Server JStatRemoteHost not available

jstatd命令是一个RMI Server应用程序,提供了对JVM的创建和结束监视,也为远程监视工具提供了一个可以attach的接口。用法

usage: jstatd [-nr] [-p port] [-n rminame]
  • -nr 当一个存在的RMI Registry没有找到时,不尝试创建一个内部的RMI Registry;
  • -p port 端口号,默认为1099;
  • -n rminame 默认为JStatRemoteHost;如果多个jstatd服务开始在同一台主机上,rminame唯一确定一个jstatd服务;
  • -J jvm选项;

在服务器直接启动jstatd会报如下异常

Could not create remote object
access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write)
java.security.AccessControlException: access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.System.setProperty(System.java:727)
at sun.tools.jstatd.Jstatd.main(Jstatd.java:122)

这是因为没有给jstatd指定安全策略,需要创建安全策略文件,自定义命名为java.all.policy,内容如下:

grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};

再次启动

jstatd -J-Djava.security.policy=java.all.policy

或使用自定义端口2020

rmiregistry 2020&
jstatd -J-Djava.security.policy=java.all.policy -p 2020

注意要指定java.all.policy文件的路径,而且记得要用root运行哦,不然只能监控到jstatd。
然后可以使用jps连接

jps 10.9.146.201

jps rmi://10.9.146.201:1099

jstat:虚拟机统计信息监视工具(JVM Statistics Monitoring Tool)

Jstat主要用于监控虚拟机的各种运行状态信息,如类的装载、内存、垃圾回收、JIT编译器等,在没有GUI的服务器上,这款工具是首选的一款监控工具。其用法如下:

jstat [option vmid [interval [s|ms] [vount] ] ]

如果是在本地虚拟机进程,vmid与lvmid是一致的,如果是远程虚拟机进程,那么vmid的格式是:[protocol:][//]lvmid[@hostname[:port]/servername]

参数interval和count分别表示查询间隔和查询次数,如每1毫秒查询一次进程20445的垃圾回收情况,监控20次,命令如下所示:

jstat –gc 20445 1 20

选项option代表用户需要查询的虚拟机的信息,主要分为3类:类装载、垃圾回收和运行期的编译情况,具体如下表所示:

  • -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编译的方法

jinfo:Java配置信息工具(Configuration Info for Java)

jinfo的作用是实时查看和调整虚拟机的各项参数,但其在windows上好多选项不能用的,用法:

Usage:
jinfo [option] <pid>
(to connect to running process)
jinfo [option] <executable <core>
(to connect to a core file)
jinfo [option] [server_id@]<remote server IP or hostname>
(to connect to remote debug server) where <option> is one of:
-flag <name> to print the value of the named VM flag
-flag [+|-]<name> to enable or disable the named VM flag
-flag <name>=<value> to set the named VM flag to the given value
-flags to print VM flags
-sysprops to print Java system properties
<no option> to print both of the above
-h | -help to print this help message

jmap:Java内存映像工具(Memory Map for Java)
jmap不仅用于生成堆转储快照,还可以查询finalize执行队列、Java堆和永久代的详细信息,如空间使用率、当前用的是哪种收集器等。和jinfo一样,jmap有不少功能在Windows平台下都是受限的。用法

Usage:
jmap [option] <pid>
(to connect to running process)
jmap [option] <executable <core>
(to connect to a core file)
jmap [option] [server_id@]<remote server IP or hostname>
(to connect to remote debug server)

主要选项如下

  • -dump:生成Java堆转储快照。格式为:-dump:[live,] format=b,file=<filename>,其中live子参数说明是否只dump出存活的对象
  • -finalizerinfo:显示在F-Queue中等待Finalizer线程执行finalize方法的对象。只在Linux/Solaris平台下有效。
  • -heap:显示Java堆详细信息,如使用哪种收集器、参数配置、分代状况等。只在Linux/Solaris平台下有效。
  • -histo:显示堆中对象统计信息,包括类、实例数量和合计容量。
  • -permstat:以ClassLoader为统计口径显示永久代内存状态。只在Linux/Solaris平台下有效。
  • -F:当虚拟机进程对-dump选项没有响应时,可以使用这个选项强制生成dump快照。只在Linux/Solaris平台下有效。

jhat:虚拟机堆转储快照分析工具(JVM Heap Analysis Tool)

jhat命令与jmap命令搭配使用,来分析jmap生成的堆存储快照。jhat内置了一个微型的HTTP/HTML服务器,生成dump文件的分析结果后,可以在浏览器中查看。实事求是地说,不过一般不会使用如此简陋的工具来分析dump文件。

jstack:Java堆栈跟踪工具(Stack Trace for Java)
jstack命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或javacore文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法的堆栈的机会,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事情,或者等待着什么资源。
jstack命令格式:

jstack [ option ] vmid

option选项的合法值与具体含义为:

  • -F : 当正常输出的请求不被响应时,强制输出线程堆栈;
  • -l:除堆栈外,显示关于锁的附加信息;
  • -m:如果调用到本地方法的话,可以显示C/C++的堆栈;

以上都是小工具,还有非常齐全的整合工具如jconsole和VisualVM,都是非常强的工具,而VisualVM是jconsole的增强版,使用VisualVM链接远程也需要启动jstatd服务,具体就不详述了。

《深入理解Java虚拟机》学习笔记之工具的更多相关文章

  1. 深入理解java虚拟机学习笔记(一)JVM内存模型

    上周末搬家后,家里的宽带一直没弄好,跟电信客服反映了N遍了终于约了个师傅明天早上来迁移宽带,可以结束一个多星期没网的痛苦日子了.这段时间也是各种忙,都一个星期没更新博客了,再不写之前那种状态和激情都要 ...

  2. 深入理解java虚拟机学习笔记(二)垃圾回收策略

    上篇文章介绍了JVM内存模型的相关知识,其实还有些内容可以更深入的介绍下,比如运行时常量池的动态插入,直接内存等,后期抽空再完善下上篇博客,今天来介绍下JVM中的一些垃圾回收策略.        一. ...

  3. 深入理解Java虚拟机学习笔记(一)-----Java内存区域

    一 概述 对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题 ...

  4. 深入理解Java虚拟机 - 学习笔记 1

    Java内存区域 程序计数器 (Program Counter Register) 是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里,字节码解释器工作时就是通过 ...

  5. 深入理解java虚拟机学习笔记(二)

    第三章 垃圾收集器与内存分配策略 概述 ​ 程序计数器.虚拟机栈.本地方法栈3个区随线程而生,随线程而灭.因此大体上可认为这几个区域的内存分配和回收都具备确定性.在方法/线程结束时,内存自然就跟着回收 ...

  6. 深入理解java虚拟机学习笔记(一)

    第二章 Java内存区域与内存溢出异常 运行时数据区域 程序计数器(Program Counter Register) 程序计数器:当前线程所执行的字节码行号指示器.各条线程之间计数器互不影响,独立存 ...

  7. 深入理解Java虚拟机学习笔记(三)-----类文件结构/虚拟机类加载机制

    第6章 类文件结构 1. 无关性 各种不同平台的虚拟机与所有平台都统一使用的程序存储格式——字节码(即扩展名为 .class 的文件) 是构成平台无关性的基石. 字节码(即扩展名为 .class 的文 ...

  8. 深入理解Java虚拟机学习笔记(二)-----垃圾收集器与内存分配策略

    写在前面 本节常见面试题: 如何判断对象是否死亡(两种方法). 简单的介绍一下强引用.软引用.弱引用.虚引用(虚引用与软引用和弱引用的区别.使用软引用能带来的好处). 如何判断一个常量是废弃常量 如何 ...

  9. 类加载机制(深入理解JAVA虚拟机学习笔记)

    1.类加载机制的定义 将class文件加载到内存,然后对class文件中的数据进行校验.解析和初始化,转换成可以被虚拟机直接使用的JAVA类型,这就是虚拟机的类加载机制.(在JAVA中,类的加载.连接 ...

  10. 《深入Java虚拟机学习笔记》- 第19章 方法的调用与返回

    <深入Java虚拟机学习笔记>- 第19章 方法的调用与返回

随机推荐

  1. 负载均衡 Lvs nat 模式笔记

    nat技术(网络地址转换) 缺点就是进入和返回都通过调度器的服务器,未来可能会成为瓶颈 实验:nat 模式 先在调度器安装ipvsadm 后再添加网卡,后面就连不上网了(yum -y install ...

  2. LVS 负载均衡解决方案 (windows IIS)

    LVS 负载均衡解决方案 因为我们的产品运行的主流平台是WINDOWS+IIS+SQLSERVER(2000以上版本),而LVS+KEEPALIVED是LINUX下的四层负载均衡软件.其有如下特点: ...

  3. No curses/termcap library found

    CentOS6.5中编译Mysql时遇见如下错误 error: No curses/termcap library found checking for tgetent in -lncurses... ...

  4. 基于ASIO的协程库orchid简介

    什么是orchid? orchid是一个构建于boost库基础上的C++库,类似于python下的gevent/eventlet,为用户提供基于协程的并发模型. 什么是协程: 协程,即协作式程序,其思 ...

  5. 自动化测试框架中关于selenium api的二次封装

    不多说,直接看代码如下: #coding:utf-8 from selenium import webdriver from selenium.webdriver.common.action_chai ...

  6. oracle sql 知识小结

    Oracle_sql : 第一单元:select 语句: ①:字符串连接操作符: || ②:去除重复行:distinct   第二单元:条件限制和排序 ①:关键字:where ②:比较操作符:=,&g ...

  7. 我的Java笔记

    第一章 一 计算机程序:一系列有序的指令集合. 二 java语言分为三个领域 javaSE java技术核心(桌面应用程序)qq 百度云 javaEE 企业版(面向internet的应用程序)京东 淘 ...

  8. JQuery之 serialize() 及serializeArray() 实例介绍

    这两个方法都是jq封装的,主要用于form表单. serialize(); 1.创建一个标准url编码显示的文本字符转: 2.操作的对象是表单元素结合的jq对象: serializeArray(); ...

  9. loadrunner解决浏览器死机问题

    初次接触loadrunner时,遇到很多问题.浏览器崩溃以及录不到脚本就折磨了一周时间.最后终于解决 一.浏览器崩溃问题 1.退出安全卫士和防火墙 2.去掉IE第三方扩展.工具-Internet选项- ...

  10. MongoDB基础之十 shared分片

    水平分片实例分布图: mongodb sharding 服务器架构   1. 添加mongdb两个shared实例 # mkdir -p /home/m17 //home/m18 /home/m20 ...