1.jinfo

描述:输出给定 java 进程所有的配置信息。包括 java 系统属性和 jvm 命令行标记等。

用法:

jinfo [ option ] pid

jinfo [ option ] executable core

jinfo [ option ] [server-id@]remote-hostname-or-IP

例子:

jinfo pid

得到结果如下:

  1. JVM version is 14.0-b16
  2. Java System Properties:
  3. java.runtime.name = Java(TM) SE Runtime Environment
  4. .0_14/jre/lib/i386
  5. java.vm.version = 14.0-b16
  6. java.vm.vendor = Sun Microsystems Inc.
  7. java.vendor.url = http://java.sun.com/
  8. path.separator = :
  9. java.vm.name = Java HotSpot(TM) Server VM
  10. file.encoding.pkg = sun.io
  11. sun.java.launcher = SUN_STANDARD
  12. user.country = CN
  13. sun.os.patch.level = unknown
  14. java.vm.specification.name = Java Virtual Machine Specification
  15. user.dir = /work/RateWorkspace/branches/rate/daemon
  16. java.runtime.version = 1.6.0_14-b08
  17. java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment
  18. .0_14/jre/lib/endorsed
  19. os.arch = i386
  20. java.io.tmpdir = /tmp
  21. line.separator =
  22. java.vm.specification.vendor = Sun Microsystems Inc.
  23. os.name = Linux
  24. .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
  25. java.specification.name = Java Platform API Specification
  26. java.class.version = 50.0
  27. sun.management.compiler = HotSpot Tiered Compilers
  28. --generic
  29. user.home = /home/yblin
  30. user.timezone = PRC
  31. java.awt.printerjob = sun.print.PSPrinterJob
  32. file.encoding = GBK
  33. java.specification.version = 1.6
  34. java.class.path =
  35. user.name = yblin
  36. java.vm.specification.version = 1.0
  37. .0_14/jre
  38. user.language = zh
  39. java.specification.vendor = Sun Microsystems Inc.
  40. java.vm.info = mixed mode
  41. java.version = 1.6.0_14
  42. .0_14/jre/lib/ext:/usr/java/packages/lib/ext
  43. .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
  44. java.vendor = Sun Microsystems Inc.
  45. file.separator = /
  46. java.vendor.url.bug = http://java.sun.com/cgi-bin/bugreport.cgi
  47. sun.io.unicode.encoding = UnicodeLittle
  48. sun.cpu.endian = little
  49. sun.desktop = gnome
  50. sun.cpu.isalist =
  51. VM Flags:
  52. -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,得到如下结果:

  1. <strong>Heap Configuration:
  2. (.0MB)
  3. (.0MB)
  4. (.9375MB)
  5. (.0MB)
  6. (.0MB)
  7. (.0MB)
  8. Heap Usage:
  9. PS Young Generation
  10. Eden Space:
  11. (.625MB)
  12. (.504425048828125MB)
  13. (.120574951171875MB)
  14. 75.41362375452898% used
  15. From Space:
  16. (.6875MB)
  17. (.6720352172851562MB)
  18. (.01546478271484375MB)
  19. 97.7505770596591% used
  20. To Space:
  21. (.6875MB)
  22. (.0MB)
  23. (.6875MB)
  24. 0.0% used
  25. PS Old Generation
  26. (.5MB)
  27. (.5618896484375MB)
  28. (.9381103515625MB)
  29. 1.2349223042582418% used
  30. PS Perm Generation
  31. (.0MB)
  32. (.939697265625MB)
  33. (.060302734375MB)
  34. 30.87310791015625% used
  35. </strong>

-histo 选项

内存使用的柱状图,包含每个类,对象使用的内存大小。 VM 内部的类名以 * 前缀开头。

  1. num     #instances         #bytes  class name
  2. ---------------------------------------------
  3. :                   [C
  4. :                   <constMethodKlass>
  5. :                   <methodKlass>
  6. :                   <symbolKlass>
  7. :                    <constantPoolKlass>
  8. :                    [B
  9. :                    <instanceKlassKlass>
  10. :                   [I
  11. :                   java.lang.String
  12. :                     <constantPoolCacheKlass>
  13. ………………

-permstat 选项

输出所有类装载器在堆里产生的对象

包括每个装载器的名字,活跃,地址,父装载器,和其总共加载的类大小。

jmap -permstat pid

得到如下结果:

  1. class_loader    classes     bytes        parent_loader alive?        type
  2. null     live   <internal>
  3. null     dead         sun/reflect/DelegatingClassLoader@0x7c2e6c28
  4. null     live   sun/misc/Launcher$ExtClassLoader@0x7c432400
  5. 0x8034d998     dead         sun/reflect/DelegatingClassLoader@0x7c2e6c28
  6. 0x8034d998     dead         sun/reflect/DelegatingClassLoader@0x7c2e6c28
  7. 0x8034d998     dead         sun/reflect/DelegatingClassLoader@0x7c2e6c28
  8. 0x8034d998     dead         sun/reflect/DelegatingClassLoader@0x7c2e6c28
  9. 0x8034d998     dead         sun/reflect/DelegatingClassLoader@0x7c2e6c28
  10. 0x8034d998     dead         sun/reflect/DelegatingClassLoader@0x7c2e6c28
  11. 0x8034d998     dead         sun/reflect/DelegatingClassLoader@0x7c2e6c28
  12. 0x8034d998     dead         sun/reflect/DelegatingClassLoader@0x7c2e6c28
  13. 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 个线程同时往控制台输出,代码如下:

  1. public class MyThread extends Thread {
  2. public MyThread(String name){
  3. super(name);
  4. }
  5. @Override
  6. public void run() {
  7. super.run();
  8. while (true) {
  9. try {
  10. System.out.println("1");
  11. } catch (Exception e) {
  12. }
  13. }
  14. }
  15. public static void main(String[] args) {
  16. ; i < ; i++) {
  17. MyThread my = new MyThread("thrad" + i);
  18. my.start();
  19. }
  20. }
  21. }

通过 jstack pid, 得到如下部分结果:

  1. tid=0x096ce400 nid=0x4305 waiting for monitor entry [0x7a280000]
  2. java.lang.Thread.State: BLOCKED (on object monitor)
  3. )
  4. - waiting to lock <0x805782c0> (a java.io.PrintStream)
  5. )
  6. tid=0x096ccc00 nid=0x4304 runnable [0x7a2d1000]
  7. java.lang.Thread.State: RUNNABLE
  8. )
  9. - locked <0x805782c0> (a java.io.PrintStream)
  10. )
  11. )
  12. )
  13. - locked <0x805783c8> (a java.io.OutputStreamWriter)
  14. )
  15. )
  16. - locked <0x805782c0> (a java.io.PrintStream)
  17. )
  18. )
  19. - locked <0x805782c0> (a java.io.PrintStream)
  20. )
  21. tid=0x096cb000 nid=0x4303 waiting for monitor entry [0x7a322000]
  22. java.lang.Thread.State: BLOCKED (on object monitor)
  23. )
  24. - waiting to lock <0x805782c0> (a java.io.PrintStream)
  25. )

可以看到只有线程 thrad75 是 RUNNABLE 状态的,其他的都是 BLOCKED 状态。因为其他的线程在竞争控制台输出的时候都被阻塞了。

其他命令 http://uule.iteye.com/blog/2114292

JVM问题诊断常用命令:jinfo,jmap,jstack的更多相关文章

  1. JVM调优命令-jinfo

    jinfo JVM Configuration info这个命令作用是实时查看和调整虚拟机运行参数. 之前的jps -v口令只能查看到显示指定的参数,如果想要查看未被显示指定的参数的值就要使用jinf ...

  2. JVM监控常用命令行工具

    jps jps -mlv //列出正在运行的虚拟机进程 jstat jstat -gc pid //监视java堆状况 显示列名 具体描述 S0C 年轻代中第一个survivor(幸存区)的容量 (字 ...

  3. JVM常用命令和性能调优建议 [Could not create the Java virtual machine]

    一.查看jvm常用命令jinfo:可以输出并修改运行时的java 进程的opts. jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号. ...

  4. JVM常用命令和性能调优建议

      一.查看jvm常用命令jinfo:可以输出并修改运行时的java 进程的opts. jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程 ...

  5. JVM系列(2)- jmap+mat实战内存溢出

    熟悉几个监控JVM的常用命令 1. jps -l 查出当前服务器运行的java进程 --- 2. jinfo用法(结合jps -l查到进程ID) 1).查看最大堆内存:jinfo -flag MaxH ...

  6. jvm系列(四):jvm调优-命令大全(jps jstat jmap jhat jstack jinfo)

    文章同步发布于github博客地址,阅读效果更佳,欢迎品尝 运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!虽然jvm调优成熟的工具已经有很多:jconsole.大名鼎 ...

  7. [转]jvm调优-命令大全(jps jstat jmap jhat jstack jinfo)

    运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!虽然jvm调优成熟的工具已经有很多:jconsole.大名鼎鼎的VisualVM,IBM的Memory Analyzer ...

  8. JVM调优 — 命令大全(jps jstat jmap jhat jstack jinfo)(转)

    运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!虽然jvm调优成熟的工具已经有很多:jconsole.大名鼎鼎的VisualVM,IBM的Memory Analyzer ...

  9. jvm调优-命令大全(jps jstat jmap jhat jstack jinfo)

    现实企业级Java开发中,有时候我们会碰到下面这些问题: OutOfMemoryError,内存不足 内存泄露 线程死锁 锁争用(Lock Contention) Java进程消耗CPU过高 运用jv ...

随机推荐

  1. leetcode & lintcode for bug-free

    刷题备忘录,for bug-free leetcode 396. Rotate Function 题意: Given an array of integers A and let n to be it ...

  2. python3数据结构

    列表 list.append(x) 把一个元素添加到列表的结尾,相当于a[len(a):]=[x] list.extend(L) 将一个给定列表中的所有元素都添加到另一个列表中,相当于a[(len): ...

  3. mac 搭建node 开发环境记录

    安装homebrew: enter 键 后 输入电脑密码 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/i ...

  4. CentOS 7 systemd service开机启动设定

    #vi /etc/systemd/system/xxx.service [Unit] Description=startup script test [Service] Type=simple Exe ...

  5. WWW 资源下载与表单提交

    在注册与验证用户信息,以及非即时通信的游戏中,我们可以使用WWW类使用短链接来完成客户端与服务器数据的通信,今天我们将使用用POST方法来完成的用户注册与登录,在最后介绍下其它资源的加载. 首先使用P ...

  6. SAP HANA中创建层次分析视图(Hierarchy Analytic View)

    1. 创建层次Attribute View: ATTR_PRODUCT_HIERACHY ref:  http://www.cnblogs.com/omygod/archive/2013/04/30/ ...

  7. 清除HTML标记

    public static string DropHTML(string Htmlstring)        {            if (string.IsNullOrEmpty(Htmlst ...

  8. Mac下Cordova开发环境搭建

    xcode下载 从Mac App Store 下载Xcode,只需要在Store键入Xcode,下载第一个就ok了 cordova安装与配置 cordova需要node安装,使用Safari打开nod ...

  9. 关于jq的load不用回调获取其中dom元素方法

    jq的load方法如果要操作其中的dom元素,需要使用回调,等其加载完了再进行dom元素的获取,今天看我们项目组长写的一段代码,发现不用回调也能获取到其中的元素. 具体是这样写的: <scrip ...

  10. 信息存储——当值X是2的非负整数n次幂时,如何表示成十六进制

    十六进制表示法              当值X是2的非负整数n次幂时,很容易将X写成十六进制形式,只要记住X的二进制表示就是1后面跟n个0.十六进制数字0代表4个二进制0.所以当n表示成i+4j的形 ...