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 ...
随机推荐
- java自动装箱的陷阱
自动装箱和拆箱是java的一颗语法糖,在给我们带来使用便利的同时也带来一些疑惑,请看下面的代码: public class TestClass { public static void main(St ...
- Front-End(一)
前端初识 现在网站开发的市场越来越大,个人和企业都有了主页.网络办公的需求,并且随着网站开发前端和后台的工作细分,前端开发的需求也越来越大. 前端的任务是将美工的网页设计使用前端技术尽可能无差别地实现 ...
- 【转】SQL Server 2008 事件探查器(SQL SERVER Profiler)
跟踪数据库sql语句的执行情况.例:一个系统,用到了sql server 数据库,这个系统共有500张表,当用户在前台页面做某一个操作时,比如插入,登录等等,我们想知道此刻是在对哪一张表操作,打开事件 ...
- [读书笔记]python3.5实现socket通讯(UDP)
UDP连接: 无连接,从一个端向另一端发送独立的数据分组 使用UDP连接的客户-服务器程序: UDPServer.py import socket serverPort = 50009 serverS ...
- apache 配置静态文件缓存和开启gzip压缩
1,设置文件静态缓存3天: 在httpd.conf 里添加如下代码: #文件静态缓存配置 <IfModule expires_module> #打开缓存 ExpiresActive on ...
- CodeForces 708B Recover the String
构造. 根据$a[0][0]$可以求得$0$的个数$p$,根据$a[1][1]$可以求得$1$的个数$q$. 如果找不到$p$或$q$,那么就无解. 每一个$0$放到序列中的任何一个位置,假设和前面的 ...
- CentOS 6.5的安装详解
CentOS 6.5的安装详解 主流: 目前的Linux操作系统主要应用于生产环境, 主流企业级Linux系统仍旧是RedHat或者CentOS 免费: RedHat 和CentOS差别不大,Cent ...
- C# 语言规范_版本5.0 (第7章 表达式)
1. 表达式 表达式是一个运算符和操作数的序列.本章定义语法.操作数和运算符的计算顺序以及表达式的含义. 1.1 表达式的分类 一个表达式可归类为下列类别之一: 值.每个值都有关联的类型. 变量.每个 ...
- Anaconda 安装概要
Anaconda 作为开源项目,集成了Python的大部分第三方包,如:pandas,Numpy,scipy等. 1. 下载地址:https://www.continuum.io/downloads ...
- sql 函数 DATEADD 使用
DATEADD ( datepart , number, date ) 在日期中添加或减去指定的时间间隔. datepart 是规定应向日期的哪一部分返回新值的参数. number 为要增加或减去 ...