《深入理解Java虚拟机》学习笔记之工具
善于利用工具,不仅可以加快我们分析数据,还可以快速定位和解决问题。现在我们就来看看虚拟机性能监控和故障处理工具。
在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虚拟机》学习笔记之工具的更多相关文章
- 深入理解java虚拟机学习笔记(一)JVM内存模型
上周末搬家后,家里的宽带一直没弄好,跟电信客服反映了N遍了终于约了个师傅明天早上来迁移宽带,可以结束一个多星期没网的痛苦日子了.这段时间也是各种忙,都一个星期没更新博客了,再不写之前那种状态和激情都要 ...
- 深入理解java虚拟机学习笔记(二)垃圾回收策略
上篇文章介绍了JVM内存模型的相关知识,其实还有些内容可以更深入的介绍下,比如运行时常量池的动态插入,直接内存等,后期抽空再完善下上篇博客,今天来介绍下JVM中的一些垃圾回收策略. 一. ...
- 深入理解Java虚拟机学习笔记(一)-----Java内存区域
一 概述 对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题 ...
- 深入理解Java虚拟机 - 学习笔记 1
Java内存区域 程序计数器 (Program Counter Register) 是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里,字节码解释器工作时就是通过 ...
- 深入理解java虚拟机学习笔记(二)
第三章 垃圾收集器与内存分配策略 概述 程序计数器.虚拟机栈.本地方法栈3个区随线程而生,随线程而灭.因此大体上可认为这几个区域的内存分配和回收都具备确定性.在方法/线程结束时,内存自然就跟着回收 ...
- 深入理解java虚拟机学习笔记(一)
第二章 Java内存区域与内存溢出异常 运行时数据区域 程序计数器(Program Counter Register) 程序计数器:当前线程所执行的字节码行号指示器.各条线程之间计数器互不影响,独立存 ...
- 深入理解Java虚拟机学习笔记(三)-----类文件结构/虚拟机类加载机制
第6章 类文件结构 1. 无关性 各种不同平台的虚拟机与所有平台都统一使用的程序存储格式——字节码(即扩展名为 .class 的文件) 是构成平台无关性的基石. 字节码(即扩展名为 .class 的文 ...
- 深入理解Java虚拟机学习笔记(二)-----垃圾收集器与内存分配策略
写在前面 本节常见面试题: 如何判断对象是否死亡(两种方法). 简单的介绍一下强引用.软引用.弱引用.虚引用(虚引用与软引用和弱引用的区别.使用软引用能带来的好处). 如何判断一个常量是废弃常量 如何 ...
- 类加载机制(深入理解JAVA虚拟机学习笔记)
1.类加载机制的定义 将class文件加载到内存,然后对class文件中的数据进行校验.解析和初始化,转换成可以被虚拟机直接使用的JAVA类型,这就是虚拟机的类加载机制.(在JAVA中,类的加载.连接 ...
- 《深入Java虚拟机学习笔记》- 第19章 方法的调用与返回
<深入Java虚拟机学习笔记>- 第19章 方法的调用与返回
随机推荐
- sqlite3编译
1.sqlite3编译: 1.PC版: 1.解压: tar xvf sqlite-autoconf-3140100.tar.gz cd sqlite-autoconf-3140100/ 2.检查配置 ...
- JQuery的$.each(list,function(i,a){} 中 i和a 未定义,a取不到值
$.each(list,function(i,a){ var status = ""; if(a.status==0) status="未审核"; else i ...
- UWP锁、解屏后无法响应操作
UWP的Unity项目,在PC上运行时,如果锁屏(手动或自动)再解锁,游戏画面和进度正常,但是无法进行鼠标.键盘或手柄的操作.这Bug在很多线上的Unity项目中存在. 原因:UWP App的系统事件 ...
- Update关联查询不走索引,效率低下
优化一个sql,就是有A,B两个表,要利用b表的字段更新a表对应的字段.形如 Sql代码 update A set A.a=(select B.b from B where A.id=B.id); 原 ...
- netcat工具的使用
用途:网络管理工具. 可以读,写TCP或UDP 网络连接.简写为:nc 常见参数: -h 帮助信息 -l 坚挺模式 -n 指定IP地址 -p 指定端口号 -v 详细输出 1 客户端:很容易建立一个客 ...
- Eclipse设置Tab键为空格!
http://z-hua.iteye.com/blog/1056713 今天设置Eclipse中按Tab键为4个空格,这里标记下! Window-->Preferences-->Java- ...
- Flex移动应用程序开发的技巧和窍门(一)
这是一个由多个部分组成的系列文章的第一部分,它包含了Flex移动开发的若干技巧.如果你过去习惯于桌面和Web编程,你会发现,开发移动应用程序将面临一系列新的挑战. 除了重新思考你的对数据存储和处理的策 ...
- 关于MATSIM中,如何关闭自动加载dtd的问题
有用过MATSIM做交通仿真的朋友应该都知道,在创建Scenario时,会默认加载matsim官网的netword的dtd文件,然后因为网络的问题,加载往往会报错,从而造成系统异常退出,如图所示: 根 ...
- redis使用Lua脚本
最近在看<Redis入门指南>第二版,感觉收获挺大,推荐大家有时间看一看.其中有一章讲Lua脚本,感觉挺实用,把总结整理一下. Redis在2.6中推出了脚本功能,允许开发者使用Lua语言 ...
- (二)Hololens Unity 开发之 语音识别
学习源于官方文档 Voice input in Unity 笔记一部分是直接翻译官方文档,部分各人理解不一致的和一些比较浅显的保留英文原文 (二)Hololens Unity 开发之 语音识别 Hol ...