JDK-bin目录下部分工具用途和使用方法整理

还是读《深入理解Java虚拟机》一书,提到了JDK目录下的很多已有的监控定位Java虚拟机运行状态的工具,好像这方面的资料不多,就连带着其他一些JDK工具一起整理下来。写着写着发现太多了,而且基本没用过,所以只记录部分我能理解的工具。另外要说下这些工具大家虽然没有直接用到,但是实际上很多工具在我们的IDE和其他开发工具链中是有用到的,例如用来debug的jdb。

  • java
    用来运行java程序的命令。用的不多,一般Java写的桌面软件都会有shell脚本或exe文件启动。偶尔也有项目组内部写的小Java软件会用到。
    使用方法:java [options] -jar filename [args]

  • javac
    初学Java都会用到的命令,用来把java文件编译成class文件。
    使用方法:javac @sourcefiles

  • javadoc
    用来把java文件中的文档注释转化成HTML文件。
    使用方法:javadoc {packages|source-files} [options] [@argfiles]

  • javah
    C 头文件和stub生成器,用于写本地化方法,例如生产JNI样式的头文件,好像我都忘光了。
    使用方法:javah [ options ] fully-qualified-class-name ...

  • javap
    反编译工具,没想到JDK中居然自带反编译工具,不过有各种集成的工具可能很少会用这个命令行来反编译。
    使用方法:javap [options] classfile...

  • jar
    这个用的稍微多点,把项目打包成jar包。
    使用方法:jar cvf hello.jar hello

  • jconsole
    一个可视化的java监视工具。
    使用方法:直接在终端输入jconsole回车。

  • jdb
    用来debug的命令行工具,但是用命令debug真的不想学。。。

  • jps
    和ps命令类似,用来查看java进程。

 ts@ts-OptiPlex-3020  ~  jps -l
9768 sun.tools.jps.Jps
9515 com.intellij.idea.Main
  • jstat
    虚拟机统计信息监视工具,比如可以监视虚拟机的gc情况。
 ts@ts-OptiPlex-3020  ~  jstat -gc 9515
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
8704.0 8704.0 4275.3  0.0   69952.0  31414.3   341532.0   204918.1  240780.0 229127.4 33788.0 31464.7     38    0.668  12      0.400    1.068
  • jinfo
    用来查看虚拟机的各项配置信息,但是已经不能用了,这个感觉还挺有用的可惜了。

  • jmap
    可以用来打印内存快照,估计很多dump工具就是继承的这个。

 ts@ts-OptiPlex-3020  ~  jmap -dump:format=b,file=jconsole-map 10623
Dumping heap to /home/ts/jconsole-map ...
Heap dump file created
  • jhat
    上面打印处了dump文件之后,可以用jhat命令来查看,直接jhat 文件名 即可。
  ts@ts-OptiPlex-3020  ~  jhat jconsole-map 
Reading from jconsole-map...
Dump file created Tue Nov 13 20:14:30 CST 2018
Snapshot read, resolving...
Resolving 88883 objects...
Chasing references, expect 17 dots.................
Eliminating duplicate references.................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

启动好后在浏览器打卡localhost:7000来打开页面。


jhat.png

分析内存泄漏主要在Show heap histogram里面定位。

  • jstack
    查看线程堆栈信息,可以显示关于锁的附加信息,对ANR问题很有帮助。
ts@ts-OptiPlex-3020  ~  jstack -l 10623
2018-11-13 20:23:00
Full thread dump OpenJDK 64-Bit Server VM (25.131-b11 mixed mode):

"Attach Listener" #18 daemon prio=9 os_prio=0 tid=0x00007f0bb4001000 nid=0x2b24 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
    - None

"DestroyJavaVM" #16 prio=5 os_prio=0 tid=0x00007f0bec00a000 nid=0x2980 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
    - None

"AWT-EventQueue-0" #14 prio=6 os_prio=0 tid=0x00007f0bec41c800 nid=0x2997 waiting on condition [0x00007f0b805fa000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x0000000084af4650> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
    at java.awt.EventQueue.getNextEvent(EventQueue.java:554)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:170)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

   Locked ownable synchronizers:
    - None
...

你可能感兴趣的:(JDK-bin目录下部分工具用途和使用方法整理)