JVM问题诊断常用命令:jinfo,jmap,jstack
1.jinfo
描述:输出给定 java 进程所有的配置信息。包括 java 系统属性和 jvm 命令行标记等。
用法:
jinfo [ option ] pid
jinfo [ option ] executable core
jinfo [ option ] [server-id@]remote-hostname-or-IP
例子:
jinfo pid
得到结果如下:
- JVM version is 14.0-b16
- Java System Properties:
- java.runtime.name = Java(TM) SE Runtime Environment
- .0_14/jre/lib/i386
- java.vm.version = 14.0-b16
- java.vm.vendor = Sun Microsystems Inc.
- java.vendor.url = http://java.sun.com/
- path.separator = :
- java.vm.name = Java HotSpot(TM) Server VM
- file.encoding.pkg = sun.io
- sun.java.launcher = SUN_STANDARD
- user.country = CN
- sun.os.patch.level = unknown
- java.vm.specification.name = Java Virtual Machine Specification
- user.dir = /work/RateWorkspace/branches/rate/daemon
- java.runtime.version = 1.6.0_14-b08
- java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment
- .0_14/jre/lib/endorsed
- os.arch = i386
- java.io.tmpdir = /tmp
- line.separator =
- java.vm.specification.vendor = Sun Microsystems Inc.
- os.name = Linux
- .0_14/jre/lib/i386/server:/work/ProgramFiles/jdk1..0_14/jre/lib/i386:/work/ProgramFiles/jdk1..0_14/jre/../lib/i386:/usr/lib/jvm/java--openjdk/jre/lib/i386/client:/usr/lib/jvm/java--openjdk/jre/lib/i386:/usr/lib/xulrunner-addons:/usr/lib/xulrunner-addons:/usr/java/packages/lib/i386:/lib:/usr/lib
- java.specification.name = Java Platform API Specification
- java.class.version = 50.0
- sun.management.compiler = HotSpot Tiered Compilers
- --generic
- user.home = /home/yblin
- user.timezone = PRC
- java.awt.printerjob = sun.print.PSPrinterJob
- file.encoding = GBK
- java.specification.version = 1.6
- java.class.path =
- user.name = yblin
- java.vm.specification.version = 1.0
- .0_14/jre
- user.language = zh
- java.specification.vendor = Sun Microsystems Inc.
- java.vm.info = mixed mode
- java.version = 1.6.0_14
- .0_14/jre/lib/ext:/usr/java/packages/lib/ext
- .0_14/jre/lib/resources.jar:/work/ProgramFiles/jdk1..0_14/jre/lib/rt.jar:/work/ProgramFiles/jdk1..0_14/jre/lib/sunrsasign.jar:/work/ProgramFiles/jdk1..0_14/jre/lib/jsse.jar:/work/ProgramFiles/jdk1..0_14/jre/lib/jce.jar:/work/ProgramFiles/jdk1..0_14/jre/lib/charsets.jar:/work/ProgramFiles/jdk1..0_14/jre/classes
- java.vendor = Sun Microsystems Inc.
- file.separator = /
- java.vendor.url.bug = http://java.sun.com/cgi-bin/bugreport.cgi
- sun.io.unicode.encoding = UnicodeLittle
- sun.cpu.endian = little
- sun.desktop = gnome
- sun.cpu.isalist =
- VM Flags:
- -ea -Dfile.encoding=GBK
这个命令包含了 JDK 和 JVM 运行起来时的一些属性。
2.jmap
描述 :输出给定 java 进程所有的内存使用信息。
使用:
jmap [ option ] pid
jmap [ option ] executable core
jmap [ option ] [server-id@]remote-hostname-or-IP
<no option>
没有可选项时,会输出所有共享的对象映射。
开始地址,映射大小,全路径。
直接 jmap pid得到如下结果:
0x08048000 46K /work/ProgramFiles/jdk1.6.0_14/bin/java
0xb6763000 74K /work/ProgramFiles/jdk1.6.0_14/jre/lib/i386/libzip.so
0xb6774000 41K /lib/tls/i686/cmov/libnss_files-2.9.so
0xb6780000 37K /lib/tls/i686/cmov/libnss_nis-2.9.so
0xb678b000 29K /lib/tls/i686/cmov/libnss_compat-2.9.so
目前还说不是很理解这个执行结果是什么意思。经询问同事了解,是加载的文件的信息。
-heap 选项
jmap -heap pid : 查看堆的配置和大当前各个区块的使用情况,如伊甸区、老年代,永久代。可以用此来判断内存目前的使用情况以及垃圾回收情况:
jmap -heap pid,得到如下结果:
- <strong>Heap Configuration:
- (.0MB)
- (.0MB)
- (.9375MB)
- (.0MB)
- (.0MB)
- (.0MB)
- Heap Usage:
- PS Young Generation
- Eden Space:
- (.625MB)
- (.504425048828125MB)
- (.120574951171875MB)
- 75.41362375452898% used
- From Space:
- (.6875MB)
- (.6720352172851562MB)
- (.01546478271484375MB)
- 97.7505770596591% used
- To Space:
- (.6875MB)
- (.0MB)
- (.6875MB)
- 0.0% used
- PS Old Generation
- (.5MB)
- (.5618896484375MB)
- (.9381103515625MB)
- 1.2349223042582418% used
- PS Perm Generation
- (.0MB)
- (.939697265625MB)
- (.060302734375MB)
- 30.87310791015625% used
- </strong>
-histo 选项
内存使用的柱状图,包含每个类,对象使用的内存大小。 VM 内部的类名以 * 前缀开头。
- num #instances #bytes class name
- ---------------------------------------------
- : [C
- : <constMethodKlass>
- : <methodKlass>
- : <symbolKlass>
- : <constantPoolKlass>
- : [B
- : <instanceKlassKlass>
- : [I
- : java.lang.String
- : <constantPoolCacheKlass>
- ………………
-permstat 选项
输出所有类装载器在堆里产生的对象
包括每个装载器的名字,活跃,地址,父装载器,和其总共加载的类大小。
jmap -permstat pid
得到如下结果:
- class_loader classes bytes parent_loader alive? type
- null live <internal>
- null dead sun/reflect/DelegatingClassLoader@0x7c2e6c28
- null live sun/misc/Launcher$ExtClassLoader@0x7c432400
- 0x8034d998 dead sun/reflect/DelegatingClassLoader@0x7c2e6c28
- 0x8034d998 dead sun/reflect/DelegatingClassLoader@0x7c2e6c28
- 0x8034d998 dead sun/reflect/DelegatingClassLoader@0x7c2e6c28
- 0x8034d998 dead sun/reflect/DelegatingClassLoader@0x7c2e6c28
- 0x8034d998 dead sun/reflect/DelegatingClassLoader@0x7c2e6c28
- 0x8034d998 dead sun/reflect/DelegatingClassLoader@0x7c2e6c28
- 0x8034d998 dead sun/reflect/DelegatingClassLoader@0x7c2e6c28
- 0x8034d998 dead sun/reflect/DelegatingClassLoader@0x7c2e6c28
- 0x8034d998 dead sun/reflect/DelegatingClassLoader@0x7c2e6c28
3.jstack - Stack Trace
为指定的线程输出 java 的线程堆栈信息,包括了进程里的所有线程。每一个线程 frame ,包括类全名,方法名,代码行。
java.lang.Thread.State : RUNNABLE BLOCKED TIMED_WATTING(sleep 后会进入这种状态 ) (如果是 BLOCKED 状态就要注意了,看看 blocked 的状态在等待什么?因为什么而阻塞?)最常见的情况是线程在等待网络的读写,比如当网络数据没有准备好读时,线程处于这种等待状态,而一旦有数据准备好读之后,线程会重新激活,读取并处理数据。
在线程中,有一些 JVM 内部的后台线程,来执行譬如垃圾回收,或者低内存的检测等等任务,这些线程往往在 JVM 初始化的时候就存在,如下所示:
"Low Memory Detector" daemon prio=10 tid=0x081465f8 nid=0x7 runnable [0x00000000..0x00000000]
"CompilerThread0" daemon prio=10 tid=0x08143c58 nid=0x6 waiting on condition [0x00000000..0xfb5fd798]
"Signal Dispatcher" daemon prio=10 tid=0x08142f08 nid=0x5 waiting on condition [0x00000000..0x00000000]
"Finalizer" daemon prio=10 tid=0x08137ca0 nid=0x4 in Object.wait() [0xfbeed000..0xfbeeddb8]
写了个代码, 100 个线程同时往控制台输出,代码如下:
- public class MyThread extends Thread {
- public MyThread(String name){
- super(name);
- }
- @Override
- public void run() {
- super.run();
- while (true) {
- try {
- System.out.println("1");
- } catch (Exception e) {
- }
- }
- }
- public static void main(String[] args) {
- ; i < ; i++) {
- MyThread my = new MyThread("thrad" + i);
- my.start();
- }
- }
- }
通过 jstack pid, 得到如下部分结果:
- tid=0x096ce400 nid=0x4305 waiting for monitor entry [0x7a280000]
- java.lang.Thread.State: BLOCKED (on object monitor)
- )
- - waiting to lock <0x805782c0> (a java.io.PrintStream)
- )
- tid=0x096ccc00 nid=0x4304 runnable [0x7a2d1000]
- java.lang.Thread.State: RUNNABLE
- )
- - locked <0x805782c0> (a java.io.PrintStream)
- )
- )
- )
- - locked <0x805783c8> (a java.io.OutputStreamWriter)
- )
- )
- - locked <0x805782c0> (a java.io.PrintStream)
- )
- )
- - locked <0x805782c0> (a java.io.PrintStream)
- )
- tid=0x096cb000 nid=0x4303 waiting for monitor entry [0x7a322000]
- java.lang.Thread.State: BLOCKED (on object monitor)
- )
- - waiting to lock <0x805782c0> (a java.io.PrintStream)
- )
可以看到只有线程 thrad75 是 RUNNABLE 状态的,其他的都是 BLOCKED 状态。因为其他的线程在竞争控制台输出的时候都被阻塞了。
JVM问题诊断常用命令:jinfo,jmap,jstack的更多相关文章
- JVM调优命令-jinfo
jinfo JVM Configuration info这个命令作用是实时查看和调整虚拟机运行参数. 之前的jps -v口令只能查看到显示指定的参数,如果想要查看未被显示指定的参数的值就要使用jinf ...
- JVM监控常用命令行工具
jps jps -mlv //列出正在运行的虚拟机进程 jstat jstat -gc pid //监视java堆状况 显示列名 具体描述 S0C 年轻代中第一个survivor(幸存区)的容量 (字 ...
- JVM常用命令和性能调优建议 [Could not create the Java virtual machine]
一.查看jvm常用命令jinfo:可以输出并修改运行时的java 进程的opts. jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号. ...
- JVM常用命令和性能调优建议
一.查看jvm常用命令jinfo:可以输出并修改运行时的java 进程的opts. jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程 ...
- JVM系列(2)- jmap+mat实战内存溢出
熟悉几个监控JVM的常用命令 1. jps -l 查出当前服务器运行的java进程 --- 2. jinfo用法(结合jps -l查到进程ID) 1).查看最大堆内存:jinfo -flag MaxH ...
- 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 ...
随机推荐
- Uva 10780 Again Prime? No Time.(分解质因子)
题意:给你两个数m和n,问 n! 可以被 m^k 整除的k的最大值 思路:从这道我们可以想到n!末尾有多少个0的问题,让我们先想一下它的思想,我们找 n! 末尾有多少0, 实际上我们是在找n!中5的个 ...
- cuda编程(一)
环境安装和例程运行 显卡主要有两家,ATI.NVIDIA,简称A卡和N卡.随着GPU计算能力的上升,采用GPU并行计算来加速的应用越来越多. Nvidia创立人之一,黄仁勋(Jen-Hsun Huan ...
- c#的as关键字
类型a as 类型b ,把类型a强制变为类型b
- Android抽屉效果 DrawerLayout 入门经验总结
今天试了试这个抽屉布局的效果,结果很崩溃无语 网上很多资料都千篇一律,感觉都有问题,下面总结下几点经验: 先上个效果图: 1. layout 布局文件中怎么写: <android.suppor ...
- CodeForces 670F Restore a Number
模拟. 首先暴力找到答案的位数,然后就是分类讨论输出答案. #pragma comment(linker, "/STACK:1024000000,1024000000") #inc ...
- 在MacOS下Python安装lxml报错xmlversion.h not found 报错的解决方案
最近在看一个自动化测试框架的问题,需要用到Lxml库,下载lxml总是报错. 1,使用pip安装lxml pip install lxml 2,然后报错了,报错内容是: In file include ...
- bzDemo
<Public> <property name="Types"> <get/> </property> <method nam ...
- <蛇形填数>--算法竞赛 入门经典(第2版)- 3.1 数组 程序3-3 蛇形填数
蛇形填数: 在n×n方阵里填入1,2,....,n×n,要求填成蛇形.例如,n = 4 时方阵为: 10 11 12 1 9 16 13 2 8 15 14 3 7 ...
- rzsz的安装
rz,sz是Linux/Unix同Windows进行ZModem文件传输的命令行工具优点:比ftp命令方便,而且服务器不用打开FTP服务. sz:将选定的文件发送(send)到本地机器rz:运行该命令 ...
- Leetcode - 458 Poor Pigs
题目: 总共有1000个罐子,其中有且只有1个是毒药,另外其他的都是水. 现在用一群可怜的猪去找到那个毒药罐. 已知毒药让猪毒发的时间是15分钟, 那么在60分钟之内,最少需要几头猪来找出那个毒药罐? ...