几个与JVM相关的JDK工具:jps, jstat, jmap
在项目中遇到OOM(Out of Memory)的问题,为了分析内存和JVM的垃圾回收器GC问题,一并把JVM相关的一些工具也研究了一下:
- jps:Java进程查看工具,实际上它和Unix/Linux上面的ps命令的功能差不多
- jstat:Java内存使用情况监控工具
- jmap:输出JVM内存中对象的工具
这些工具位于JAVA_HOME/bin目录下
?
一,jps (Java Virtual Machine Process Status Tool) JVM进程状态工具
jps用来查看host上运行的所有java进程的pid(lvmid),一般情况下使用这个工具的目的只是为了找出运行的jvm进程ID,即lvmid,然后可以进一步使用其它的工具来监控和分析JVM,因此可以说这个工具并没有太多的功能。
如我本地只启动了visualVM,jps可以看到
1 |
2156 Jps |
常用的几个参数:
-l 输出java应用程序的main class的完整包
-q 仅显示pid,不显示其它任何相关信息
-m 输出传递给main方法的参数
-v 输出传递给JVM的参数。在诊断JVM相关问题的时候,这个参数可以查看JVM相关参数的设置
如使用 jps -l -v 命令可以输出如下
1 |
C:\Oracle\Middleware\jdk160_05\bin>jps -l -v |
?
jps的官方描述:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jps.html
?
二,jstat (Java Virtual Machine Statistics Monitoring Tool) JVM统计信息监控工具
jstat根据lvmid来实时监控Java应用程序的资源和性能,包括jvm的heap size和GC的回收状况,比起jps工具jstat要强大得多,同时使用起来也较复杂。
?
jstat有如下的生成结果选项(通过 jstat –options 来查看),jstat需要列出lvmid的统计信息,因此需要和jps配合使用
-class :显示加载类和卸载类的数量、所占空间大小和加载类和卸载类所花的时间
-compiler:显示VM实时编译的统计信息,包括编译任务执行的数量、编译任务失败的数量、变为无效的编译任务数量、执行编译任务所花费的时间等等
-gc:显示GC的堆信息,包括存活区、新生代区、永久区、发生GC的次数和所花费的时间
-gccapacity:显示JVM内存池中三代(young、old、perm)对象的使用和占用能力
-gccause:这个和-gcutil选项一样都是显示GC统计信息的汇总信息,只是包括了最后GC事件和当前GC事件
-gcnew:显示新生代对象的统计信息
-gcnewcapacity:显示新生代对象的信息和占用量
-gcold:显示老一代对象的统计信息
-gcoldcapacity:显示老一代对象的信息和占用量
-gcpermcapacity:显示永久代对象的信息和占用量
-gcutil:显示GC统计信息的汇总信息
-printcompilation:打印当前VM执行的信息
?
此工具中涉及到的永久代、老一代和新生代的概念和jdk的GC算法有密切的关系,关于GC的内容请查看Tuning Garbage Collection with the 5.0 JavaTM Virtual Machine
jstat使用的除了上面生成结果选项之外,还有收集统计信息的时间间隔和统计的次数,同时还可以控制输出结果的列标题如何出现。
1 |
C:\Oracle\Middleware\jdk160_05\bin>jstat -gcnew -t -h3 1932 30 5 |
?
上面的 -t 选项是用来打印timestamp,-hN选项是用来控制打印列标题,这个选项对于多屏输出结果的时候比较有用,因此上面的jstat -gcnew -t -h3 1932 30 5 代表针对lvmid为 1932 的Java进程收集新生代对象统计信息:包括打印时间戳、每隔3行打印一次标题、30ms统计一次、共统计5次
每个选项输出列的含义请查看官方文档,jstat的官方描述:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstat.html
虽然jstat提供了监控GC状态的强大功能,但是由于它是命令行,在实际问题的分析过程中难度比较高,因此市场上面出现了很多基于此命令的可视化工具,开源工具visualVM就是其中的佼佼者,JDK1.6之后,它已经包括在jdk中了。
?
关于如何使用visualVM来可视化监控JVM状况,后续将整理相关的文章。
?
三,jmap (Memory Map) JVM内存对象打印工具
jmap根据lvmid来Java进程的内存所有对象
?
首先根据选项打印出Java对象堆的直方图信息,包括Java类、类实例对象数量、在内存中占有量的大小以及类的完整包名,下面是缩减版本的直方图信息:
1 |
C:\Oracle\Middleware\jdk160_05\bin>jmap -histo 3432 |
?
其次是将内存堆的信息dump成为一个二进制文件,供jhat这样的Java内存分析工具来使用,如下降Java内存对象堆dump为heap.bin文件:
1 |
C:\Oracle\Middleware\jdk160_05\bin>jmap -dump:format=b,file=heap.bin 3432 |
命令运行完成之后,在同目录下会生成一个heap.bin二进制内存对象堆文件
?
此工具使用比较简单,但是它对于分析内存溢出问题非常有用,目前有很多用来分析Java内存对象的工具,如收费的工具有:jprofiler,YourKit Java Profiler;而像Eclipse MAT则是优秀的内存对象分析开源工具,后续将整理相关的文章。
几个与JVM相关的JDK工具:jps, jstat, jmap的更多相关文章
- jvm系列(四):jvm调优-命令大全(jps jstat jmap jhat jstack jinfo)
文章同步发布于github博客地址,阅读效果更佳,欢迎品尝 运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!虽然jvm调优成熟的工具已经有很多:jconsole.大名鼎 ...
- [转]jvm调优-命令大全(jps jstat jmap jhat jstack jinfo)
运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!虽然jvm调优成熟的工具已经有很多:jconsole.大名鼎鼎的VisualVM,IBM的Memory Analyzer ...
- JVM调优 — 命令大全(jps jstat jmap jhat jstack jinfo)(转)
运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!虽然jvm调优成熟的工具已经有很多:jconsole.大名鼎鼎的VisualVM,IBM的Memory Analyzer ...
- jvm调优-命令大全(jps jstat jmap jhat jstack jinfo)
现实企业级Java开发中,有时候我们会碰到下面这些问题: OutOfMemoryError,内存不足 内存泄露 线程死锁 锁争用(Lock Contention) Java进程消耗CPU过高 运用jv ...
- jvm性能监控(3)-jdk自带工具 jps jstack jmap
一.概要: jps -l 查看现有的java进程 jps -l 显示所有正在运行的java进程id jstack 查看Java线程 jstack -l pid; 做thread dump ...
- jvm 性能调优工具之 jstat 命令详解
Jstat名称:Java Virtual Machine statistics monitoring tool 官方文档:https://docs.oracle.com/javase/1.5.0/do ...
- jvm 性能调优工具之 jstat
概述 Jstat是JDK自带的一个轻量级小工具.全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建 ...
- 【Linux】在linux上java工具jps jstat jinfo等命令找不到怎么办
一.yum安装方式 1)搜索openjdk-devel相关的安装包 yum search java|grep jdk 2)安装对应的版本 yum install -y java-1.8.0-openj ...
- 一、jdk工具之jps(JVM Process Status Tools)命令使用
目录 一.jdk工具之jps(JVM Process Status Tools)命令使用 二.jdk命令之javah命令(C Header and Stub File Generator) 三.jdk ...
随机推荐
- linux第五周
第五周 给MenuOS增加time和time-asm命令 更新menu代码到最新版 在main函数中增加MenuConfig 增加对应的Time函数和TimeAsm函数 make rootfs 使用g ...
- UVA 12338 Anti-Rhyme Pairs(hash + 二分)题解
题意:给出两个字符串的最大相同前缀. 思路:hash是要hash,不hash是不可能的.hash完之后从头遍历判断超时然后陷入沉默,然后告诉我这能二分orz,二分完就过了,写二分条件写了半天.不要用数 ...
- 2016"百度之星" - 资格赛(Astar Round1) A 逆元
Problem A Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem ...
- Singleton(单例)
意图: 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 适用性: 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时. 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代 ...
- js 面试题总结 3
console.log(a); // undefined function fn() { console.log(a); // undefined } fn(); console.log(a); 创建 ...
- Android之提示Toast
步骤: 设置监听事件步骤1.事件源,如按键 btn_simple2.事件 OnClick3.监听器new OnClickListener3.绑定事件源与事件 setOnClickListener(ne ...
- $ocLazyLoad
博客:http://zhidao.baidu.com/link?url=1eODexxXPsl2gy4UsRnfIqPJnzFrzFk2JJad-cjWDiyCKkb4qxS8scvxoMRqM0Fw ...
- 递归--练习9--noi8758 2的幂次方表示
递归--练习9--noi8758 2的幂次方表示 一.心得 找准子问题就好 二.题目 8758:2的幂次方表示 总时间限制: 1000ms 内存限制: 65536kB 描述 任何一个正整数都可以用 ...
- FastJson/spring boot: json输出方法二
1.引入FastJson依赖包 <!-- FastJson --> <dependency> <groupId>com.alibaba</groupId> ...
- myeclipse出现src作为报名一部分src.com.*
打开历史悠久的项目,所有类报错,发现src变成了报名的一部分. 右击src->Build Path->Use as Source Folder即可. WebRoot中同理.