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 ...
随机推荐
- Netty(7)源码-ByteBuf
一.ByteBuf工作原理 1. ByteBuf是ByteBuffer的升级版: jdk中常用的是ByteBuffer,从功能角度上,ByteBuffer可以完全满足需要,但是有以下缺点: ByteB ...
- 约瑟夫问题-Josephus--及实例说明
//---我保证所有的代码都已经通过测试---// 类似约瑟夫的问题又称为约瑟夫环.又称“丢手绢问题”. 这个问题来自于这样的一个关于著名犹太历史学家 Josephus传说: 在罗马人占领乔塔帕特后, ...
- JsSIP.UA.JsSIP 总是返回错误:422 Session Interval Too Small
在JsSIP 中 JsSIP.UA.call 总是 返回错误:422 Session Interval Too Small 关于错详情在这篇文章中解释的比较详尽:http://www.cnblogs. ...
- MultipartResolver 文件上传
SpringMVC 中文件上传 MultipartResolver 博客分类: SpringMVC - 基础篇 基于前面文章的基础上. 一.准备 需要的jar 二.配置 1. spmvc-se ...
- 正确的IP地址正则表达式
((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
- appnium框架以及源码研究
android4.0后,google提供了uiautomator来进行自动化方案,appium在高版本android上就是基于这个,4.0下是基于selendroid. appium相当于一个中转站, ...
- Struts2中一个自定义拦截器的使用
1.自定义的拦截器的类: package it.web.interceptor; import com.opensymphony.xwork2.ActionContext; import com.op ...
- nginx的https环境如何配置
http://www.cnblogs.com/yanghuahui/archive/2012/06/25/2561568.html http://www.fzb.me/2015-1-15-openss ...
- 转 错误:ORA-28002: the password will expire within 7 days 解决方法
今天在使用sqlplus时出现 =============================================== ERROR:ORA-28002: the password will e ...
- git中添加多个SSH公钥,以及不同系统之间的差别
git学习已经也有一段时间了,基本的操作,口令会了一点点,但是还没有git团队开发的实践,这个有待加强~ git是在windows下面模拟Linux环境的,linux自带的ssh服务,可以通过该服务远 ...