jstat,这个工具很强大,可以监测Java虚拟机GC多方面的状态,具体参数含义参见此链接

  1. ./jstat -gc 84012 1000 3
  2. S0C    S1C    S0U    S1U      EC       EU        OC         OU       PC     PU    YGC     YGCT    FGC    FGCT     GCT
  3. 2112.0 2112.0  0.0    0.0   17024.0    0.0     63872.0     1319.9   21248.0 4728.1 743416  209.646   5      0.046  209.692
  4. 2112.0 2112.0  0.0    0.0   17024.0    0.0     63872.0     1319.9   21248.0 4728.1 743849  209.755   5      0.046  209.801
  5. 2112.0 2112.0  0.0    0.0   17024.0    0.0     63872.0     1319.

jmap,这大概是最常用的命令。下面这个命令不但可以列出类的实例数量,还有强制进行一次full GC的“副作用”,这样的副作用对于定位某些问题很有帮助,参见《使用堆外内存》:

  1. ./jmap -histo:live 84012
  2. num     #instances         #bytes  class name
  3. ----------------------------------------------
  4. 1:           824        1177656  [B
  5. 2:          8096        1106672
  6. ...

使用-heap参数,则可以打印堆的使用情况:

  1. ./jmap -heap 84012
  2. Attaching to process ID 84012, please wait...
  3. Debugger attached successfully.
  4. Server compiler detected.
  5. JVM version is 20.65-b04-462
  6. using parallel threads in the new generation.
  7. using thread-local object allocation.
  8. Concurrent Mark-Sweep GC
  9. Heap Configuration:
  10. MinHeapFreeRatio = 40
  11. MaxHeapFreeRatio = 70
  12. MaxHeapSize      = 132120576 (126.0MB)
  13. NewSize          = 21757952 (20.75MB)
  14. MaxNewSize       = 174456832 (166.375MB)
  15. OldSize          = 65404928 (62.375MB)
  16. NewRatio         = 7
  17. SurvivorRatio    = 8
  18. PermSize         = 21757952 (20.75MB)
  19. MaxPermSize      = 85983232 (82.0MB)
  20. Heap Usage:
  21. New Generation (Eden + 1 Survivor Space):
  22. capacity = 19595264 (18.6875MB)
  23. used     = 16785688 (16.008079528808594MB)
  24. free     = 2809576 (2.6794204711914062MB)
  25. 85.66196403375837% used
  26. Eden Space:
  27. capacity = 17432576 (16.625MB)
  28. used     = 16785688 (16.008079528808594MB)
  29. free     = 646888 (0.6169204711914062MB)
  30. 96.28920017328477% used
  31. From Space:
  32. capacity = 2162688 (2.0625MB)
  33. used     = 0 (0.0MB)
  34. free     = 2162688 (2.0625MB)
  35. 0.0% used
  36. To Space:
  37. capacity = 2162688 (2.0625MB)
  38. used     = 0 (0.0MB)
  39. free     = 2162688 (2.0625MB)
  40. 0.0% used
  41. concurrent mark-sweep generation:
  42. capacity = 65404928 (62.375MB)
  43. used     = 1390576 (1.3261566162109375MB)
  44. free     = 64014352 (61.04884338378906MB)
  45. 2.126102791520541% used
  46. Perm Generation:
  47. capacity = 21757952 (20.75MB)
  48. used     = 4852336 (4.6275482177734375MB)
  49. free     = 16905616 (16.122451782226562MB)
  50. 22.301437194088855% used

使用-permstat参数,查看永久区:

  1. ./jmap -permstat 84012
  2. Attaching to process ID 84012, please wait...
  3. Debugger attached successfully.
  4. Server compiler detected.
  5. JVM version is 20.65-b04-462
  6. 1239 intern Strings occupying 104312 bytes.
  7. finding class loader instances ..Warning: skipping invalid TLAB for thread t@59779
  8. Warning: skipping invalid TLAB for thread t@59527
  9. Warning: skipping invalid TLAB for thread t@59907
  10. Warning: skipping invalid TLAB for thread t@60163
  11. Warning: skipping invalid TLAB for thread t@60419
  12. Warning: skipping invalid TLAB for thread t@60675
  13. Finding object size using Printezis bits and skipping over...
  14. done.
  15. computing per loader stat ..done.
  16. please wait.. computing liveness...done.
  17. class_loader    classes bytes   parent_loader   alive?  type
  18. 590 3973048   null      live
  19. 0x00000007f44cace0  0   0     null      live    sun/misc/Launcher$ExtClassLoader@0x00000007faff8a40
  20. 0x00000007f44c1478  8   143928  0x00000007f44cace0  live    sun/misc/Launcher$AppClassLoader@0x00000007fb056e88
  21. total = 3   598 4116976     N/A     alive=3, dead=0     N/A

把内存中的堆dump成一个镜像文件:

  1. ./jmap -dump:live,format=b,file=/Users/xiongyi/Documents/dump.core 84012

jstack,线程堆栈打印。注意waiting to lock <xxx>在等待锁,比如进入临界区时;locked <xxx>表示当前同步操作,线程锁住了某资源;而waiting on <xxx>指的是在同步块内,wait方法的执行中暂时地释放了该锁的占用,等唤醒的时候需要重新获取:

  1. ./jstack 84012
  2. 2013-11-11 18:30:35
  3. Full thread dump Java HotSpot(TM) 64-Bit Server VM (20.65-b04-462 mixed mode):
  4. "Attach Listener" daemon prio=9 tid=7ff64e206800 nid=0x117782000 waiting on condition [00000000]
  5. java.lang.Thread.State: RUNNABLE
  6. "Low Memory Detector" daemon prio=5 tid=7ff64c80f000 nid=0x117c96000 runnable [00000000]
  7. java.lang.Thread.State: RUNNABLE
  8. "C2 CompilerThread1" daemon prio=9 tid=7ff64c80e800 nid=0x117b93000 waiting on condition [00000000]
  9. java.lang.Thread.State: RUNNABLE
  10. "C2 CompilerThread0" daemon prio=9 tid=7ff64c80d800 nid=0x117a90000 waiting on condition [00000000]
  11. java.lang.Thread.State: RUNNABLE
  12. "Signal Dispatcher" daemon prio=9 tid=7ff64c80d000 nid=0x11798d000 runnable [00000000]
  13. java.lang.Thread.State: RUNNABLE
  14. "Surrogate Locker Thread (Concurrent GC)" daemon prio=5 tid=7ff64c80c000 nid=0x11788a000 waiting on condition [00000000]
  15. java.lang.Thread.State: RUNNABLE
  16. "Finalizer" daemon prio=8 tid=7ff64e13d800 nid=0x11767f000 in Object.wait() [11767e000]
  17. java.lang.Thread.State: WAITING (on object monitor)
  18. at java.lang.Object.wait(Native Method)
  19. - waiting on <7f44c0ed0> (a java.lang.ref.ReferenceQueue$Lock)
  20. at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
  21. - locked <7f44c0ed0> (a java.lang.ref.ReferenceQueue$Lock)
  22. at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
  23. at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:171)
  24. "Reference Handler" daemon prio=10 tid=7ff64e13c800 nid=0x11757c000 in Object.wait() [11757b000]
  25. java.lang.Thread.State: WAITING (on object monitor)
  26. at java.lang.Object.wait(Native Method)
  27. - waiting on <7f44c0018> (a java.lang.ref.Reference$Lock)
  28. at java.lang.Object.wait(Object.java:485)
  29. at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
  30. - locked <7f44c0018> (a java.lang.ref.Reference$Lock)
  31. "main" prio=5 tid=7ff64c800800 nid=0x10f709000 runnable [10f708000]
  32. java.lang.Thread.State: RUNNABLE
  33. at test.Test.main(Test.java:7)
  34. "VM Thread" prio=9 tid=7ff64e138000 nid=0x117479000 runnable
  35. "Gang worker#0 (Parallel GC Threads)" prio=9 tid=7ff64e000000 nid=0x112b0f000 runnable
  36. "Gang worker#1 (Parallel GC Threads)" prio=9 tid=7ff64e001000 nid=0x112c12000 runnable
  37. "Gang worker#2 (Parallel GC Threads)" prio=9 tid=7ff64e001800 nid=0x112d15000 runnable
  38. "Gang worker#3 (Parallel GC Threads)" prio=9 tid=7ff64e002000 nid=0x112e18000 runnable
  39. "Gang worker#4 (Parallel GC Threads)" prio=9 tid=7ff64e002800 nid=0x112f1b000 runnable
  40. "Gang worker#5 (Parallel GC Threads)" prio=9 tid=7ff64e003800 nid=0x11301e000 runnable
  41. "Gang worker#6 (Parallel GC Threads)" prio=9 tid=7ff64e004000 nid=0x113121000 runnable
  42. "Gang worker#7 (Parallel GC Threads)" prio=9 tid=7ff64e004800 nid=0x113224000 runnable
  43. "Concurrent Mark-Sweep GC Thread" prio=9 tid=7ff64e0e2000 nid=0x1170f0000 runnable
  44. "Gang worker#0 (Parallel CMS Threads)" prio=9 tid=7ff64e0e0800 nid=0x1166ea000 runnable
  45. "Gang worker#1 (Parallel CMS Threads)" prio=9 tid=7ff64e0e1800 nid=0x1167ed000 runnable
  46. "VM Periodic Task Thread" prio=10 tid=7ff64c820800 nid=0x117d99000 waiting on condition
  47. "Exception Catcher Thread" prio=10 tid=7ff64c801800 nid=0x10f936000 runnable
  48. JNI global references: 963

jinfo,可以打印JVM执行的参数信息,有一个非常大的作用在于,部分JVM参数在执行过程中是可以修改的,请参见这篇《通过jinfo工具在full GC前后做heap dump》,通过jinfo改变参数HeapDumpBeforeFullGC和HeapDumpAfterFullGC,输出heap dump后,再改回来。

jhat,可以比对core文件之间的对象变化,支持对象查询语言(OQL),请参见这里

  1. ./jhat -stack true -refs true -port 8080 -baseline /xxx/dump-baseline.core -debug 1 /Users/xiongyi/Documents/dump-newer.core

javap,用于反编译class文件,对于JVM指令集,这里有完整的文档

  1. javap -c -v ./Test.class
  2. Classfile xxx/Test.class
  3. Last modified Nov 11, 2013; size 441 bytes
  4. MD5 checksum 69488187cc8a8f166bc6dd0d517fb4cb
  5. Compiled from "Test.java"
  6. public class test.Test
  7. SourceFile: "Test.java"
  8. minor version: 0
  9. major version: 50
  10. flags: ACC_PUBLIC, ACC_SUPER
  11. Constant pool:
  12. #1 = Methodref          #6.#16         //  java/lang/Object."":()V
  13. #2 = Integer            1048576
  14. #3 = Fieldref           #17.#18        //  java/lang/System.out:Ljava/io/PrintStream;
  15. #4 = Methodref          #19.#20        //  java/io/PrintStream.println:(Ljava/lang/Object;)V
  16. #5 = Class              #21            //  test/Test
  17. #6 = Class              #22            //  java/lang/Object
  18. #7 = Utf8
  19. #8 = Utf8               ()V
  20. #9 = Utf8               Code
  21. #10 = Utf8               LineNumberTable
  22. #11 = Utf8               main
  23. #12 = Utf8               ([Ljava/lang/String;)V
  24. #13 = Utf8               StackMapTable
  25. #14 = Utf8               SourceFile
  26. #15 = Utf8               Test.java
  27. #16 = NameAndType        #7:#8          //  "":()V
  28. #17 = Class              #23            //  java/lang/System
  29. #18 = NameAndType        #24:#25        //  out:Ljava/io/PrintStream;
  30. #19 = Class              #26            //  java/io/PrintStream
  31. #20 = NameAndType        #27:#28        //  println:(Ljava/lang/Object;)V
  32. #21 = Utf8               test/Test
  33. #22 = Utf8               java/lang/Object
  34. #23 = Utf8               java/lang/System
  35. #24 = Utf8               out
  36. #25 = Utf8               Ljava/io/PrintStream;
  37. #26 = Utf8               java/io/PrintStream
  38. #27 = Utf8               println
  39. #28 = Utf8               (Ljava/lang/Object;)V
  40. {
  41. public test.Test();
  42. flags: ACC_PUBLIC
  43. Code:
  44. stack=1, locals=1, args_size=1
  45. 0: aload_0
  46. 1: invokespecial #1                  // Method java/lang/Object."":()V
  47. 4: return
  48. LineNumberTable:
  49. line 4: 0
  50. public static void main(java.lang.String[]);
  51. flags: ACC_PUBLIC, ACC_STATIC
  52. Code:
  53. stack=2, locals=2, args_size=1
  54. 0: ldc           #2                  // int 1048576
  55. 2: newarray       byte
  56. 4: astore_1
  57. 5: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
  58. 8: aload_1
  59. 9: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
  60. 12: goto          0
  61. LineNumberTable:
  62. line 7: 0
  63. line 8: 5
  64. line 9: 12
  65. StackMapTable: number_of_entries = 1
  66. frame_type = 0 /* same */
  67. }

java自带命令工具的更多相关文章

  1. java自带BASE64工具进行图片和字符串转换

    java自带BASE64工具进行图片和字符串转换 import java.io.File; import java.io.FileInputStream; import java.io.FileOut ...

  2. java自带BASE64工具进行图片和字符串转换【转】

    java自带BASE64工具进行图片和字符串转换 import java.io.File; import java.io.FileInputStream; import java.io.FileOut ...

  3. Java自带命令详解

    1. 背景 给一个系统定位问题的时候,知识.经验是关键基础,数据(运行日志.异常堆栈.GC日志.线程快照[threaddump / javacore文件].堆转储快照[heapdump / hprof ...

  4. 常用java自带命令概览

    ref:http://www.hollischuang.com/archives/308 一.常用命令 jps: 查看本机的Java中进程信息. jstack: 打印线程的执行栈信息. jmap: 打 ...

  5. java jvm常用命令工具

    [尊重原创文章出自:http://www.chepoo.com/java-jvm-command-tools.html] 一.概述 程序运行中经常会遇到各种问题,定位问题时通常需要综合各种信息,如系统 ...

  6. java 自带的工具

    前辈说,java的基本功的好坏,一个方面要看是否能熟练使用jdk bin下的工具使用情况. 自己整理一下使用的工具. ■ javac 一个编译java的工具,进入java所在文件的路径后,javac ...

  7. 如何用java自带的工具生成证书

    一.keytool的概念 keytool 是个密钥和证书管理工具.它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务.在 ...

  8. java自带dom工具使用实例

    代码参考自 黄亿华大神的<<1000行代码读懂Spring(一)- 实现一个基本的IoC容器>> 原网页如下 http://my.oschina.net/flashsword/ ...

  9. Java内存泄露分析和解决方案及Windows自带查看工具

    Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最快最好的检测程序的稳定性,防止系统崩盘,作者用自已的亲身经历 ...

随机推荐

  1. Winform开发框架重构总结

    最近一直致力于Winform开发框架的重构工作,因为发现要维护传统Winform开发框架.WCF开发框架.混合式开发框架,以及相关的模块,包括权限管理.字典管理模块.附件管理.人员管理等一些辅助模块, ...

  2. C#基本概念列举说明

    1. 关键字      在C#代码中常常使用关键字,关键字也叫保留字,是对C#有特定意义的字符串.关键字在Visual Studio 环境的代码视图中默认以蓝色显示.例如,代码中的using.name ...

  3. SignalR+Asp.net高频率实时消息传递应用

    1.概述: 使用 ASP.NET 和SignalR 2高频率的实时消息功能.高频率消息在这种情况下就意味着更新发送以固定的速率; 本教程中创建的应用程序显示一个用户可以拖动的形状.在所有其他连接浏览器 ...

  4. java多线程(一)——线程安全的单例模式

    概念: java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3. ...

  5. AloneJs.confirmbox() —— 确认框

    一.引用 <link href="https://cdn.suziyun.com/alonejs.min.css" rel="stylesheet" /& ...

  6. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q91-Q93)

    Question 91You have a custom user profile property named MyProperty.You need to create a Web Part th ...

  7. Sql server 2008 R2 配置管理工具服务显示远程过程调用失败:0x800706be

    Sql server 2008 R2 配置管理工具服务显示远程过程调用失败:0x800706be   今天在其他电脑配置 SQl server 2008 R2,安装完成后,发现打开配置管理工具服务 : ...

  8. iOS阅读器实践系列(一)coretext纯文本排版基础

    前言:之前做了公司阅读类的App,最近有时间来写一下阅读部分的实现过程,供梳理逻辑,计划会写一个系列希望能涉及到尽量多的方面与细节,欢迎大家交流.吐槽.拍砖,共同进步. 阅读的排版用的是coretex ...

  9. 【读书笔记】iOS-验证应用内支付的凭证注意事项

    1,简单来说,越狱后的手机由于没有沙盒作为保护,黑客可以对系统进行任意的修改,所以,在支付过程中,苹果返回的已付款成功的凭证可能是伪造的.客户端拿到付款凭证之后,还需要将凭证上传到自己的服务器,进行二 ...

  10. 安卓第十三天笔记-服务(Service)

    安卓第十三天笔记-服务(Service) Servcie服务 1.服务概念 服务 windows 服务没有界面,一直运行在后台, 运行在独立的一个进程里面 android 服务没有界面,一直运行在后台 ...