`

JDK 工具命令使用

阅读更多

 

编写不易,转载请注明(http://shihlei.iteye.com/blog/2423653)

一 概述

Java应用,线上查看gc,堆分配,堆使用是很常见的需求。JDK自带的命令可以查看很多信息,掌握后对我们定位问题能起到很大的帮助。

本文总结相关命令的使用。

 

二 jstack:查看java线程信息

(1)用法:

常用方式:jstack [-l] <pid>   

 

 jstack -l 912
2018-05-27 10:34:53
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.101-b13 mixed mode):

。。。。。。
"main" #1 prio=5 os_prio=31 tid=0x00007fa084000000 nid=0x2803 waiting on condition [0x000070000b354000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
	at java.lang.Thread.sleep(Native Method)
	at java.lang.Thread.sleep(Thread.java:340)
	at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
	at HelloWorld.main(HelloWorld.java:12)

   Locked ownable synchronizers:
	- None

"VM Thread" os_prio=31 tid=0x00007fa083819000 nid=0x3103 runnable

"GC task thread#0 (ParallelGC)" os_prio=31 tid=0x00007fa08301b800 nid=0x1c07 runnable

。。。。。。

JNI global references: 6

 

 

 说明:

"main" 线程名称。用户自己的程序最好是线程名称

prio=5 线程优先级默认是5

tid= 0x00007fa084000000 唯一标识

nid=0x2803  对应系统线程的id和top出来看到的pid是对应的(十进制转16进制)

TIMED_WAITING线程状态

 

状态如下:

1,死锁  Deadlock(重要)

2,等待资源 Waiting on condition (重要)

3,等待获取监视器waiting on monitor entry

4,阻塞Blocked

5,执行中Runnable

6,暂停Suspended

7,对象等待中Object.wait()或TIMED_WAITING

8,停止Parked

 

(2)场景:查看cpu使用率最高的线程

1) 查看cpu使用率最高的线程top10:

 

命令:ps -mp [pid] -o THREAD,tid,time | sort -k2  -nr | head -10

其中:[pid] 是进程号

[root]# ps -mp 1000 -o THREAD,tid,time | sort -k2  -nr | head -10
root     10.6   -    - -         -      -     - 1-18:45:53
root      5.6  19    - futex_    -      - 10784 22:35:57
root      0.4  19    - futex_    -      - 10770 01:51:14
root      0.2  19    - futex_    -      - 10712 00:52:56
root      0.2  19    - futex_    -      - 10711 00:52:55
root      0.2  19    - futex_    -      - 10710 00:52:56
root      0.2  19    - futex_    -      - 10709 00:52:55
root      0.2  19    - futex_    -      - 10708 00:52:55
root      0.2  19    - futex_    -      - 10707 00:52:55
root      0.2  19    - futex_    -      - 10706 00:52:53

 

2) 查看Java 线程信息:

 

命令:tid=`printf "%x\n" [tid]`; echo "tid : ${tid}" ; jstack -l [pid] | grep ${tid} -A 10

其中:[pid] :进程id

           [tid] :线程id

 

[root]# tid=`printf "%x\n" 10784`; echo "tid : ${tid}" ; ./jstack -l 1000 | grep ${tid} -A 10
tid : 2a20
"ContainerBackgroundProcessor[StandardEngine[Catalina]]" #48 daemon prio=5 os_prio=0 tid=0x00007f344c504000 nid=0x2a20 waiting on condition [0x00007f33b23b3000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1340)
        at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
        - None

 

三 jstat:查看堆内存使用及gc信息

(1)用法:

常用方式: jstat -gc vmid

 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
3392.0 3392.0  0.0   2185.4 27328.0  21297.2   68288.0     3429.1   9216.0 8854.1 1024.0 939.1       3    0.039   2      0.037    0.076
3392.0 3392.0  0.0   2185.4 27328.0  21678.1   68288.0     3429.1   9216.0 8854.1 1024.0 939.1       3    0.039   2      0.037    0.076
3392.0 3392.0  0.0   2185.4 27328.0  22709.9   68288.0     3429.1   9216.0 8854.1 1024.0 939.1       3    0.039   2      0.037    0.076
3392.0 3392.0  0.0   2185.4 27328.0  23611.4   68288.0     3429.1   9216.0 8854.1 1024.0 939.1       3    0.039   2      0.037    0.076
3392.0 3392.0  0.0   2185.4 27328.0  24553.2   68288.0     3429.1   9216.0 8854.1 1024.0 939.1       3    0.039   2      0.037    0.076

 

 

说明:

S0C   :S0 总大小

S1C   :S1 总大小

S0U   :S0 使用大小

S1U   :S1 使用大小

EC     :伊甸区总大小 

EU     :伊甸区使用大小   

OC    :老年代总大小     

OU    :老年代使用大小   

MC    :Metaspace 总大小 

MU    :Metaspace 使用大小

CCSC   :CompressedClassSpace总大小

CCSU   :CompressedClassSpace使用大小

YGC     :Young GC 次数

YGCT   :Young GC 消耗总时间

FGC     :FullGC 次数

FGCT   :FullGC 消耗总时间

GCT     :GC总消耗时间  

 

三 jmap

(1)查看堆设置:jmap -heap [pid]

 

 

Attaching to process ID 18095, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.31-b07
 
using thread-local object allocation.
Mark Sweep Compact GC
 
Heap Configuration:
   MinHeapFreeRatio         = 40     最小堆使用比例
   MaxHeapFreeRatio         = 70   最大堆可用比例
   MaxHeapSize              = 104857600 (100.0MB)   最大堆空间大小
   NewSize                  = 34930688 (33.3125MB)  新生代分配大小
   MaxNewSize               = 34930688 (33.3125MB) 最大可新生代分配大小
   OldSize                  = 69926912 (66.6875MB) 老生代大小
   NewRatio                 = 2 (old/young generations) 新生代比例
   SurvivorRatio            = 8 (young/suvivor )新生代与suvivor的比例
   MetaspaceSize            = 21807104 (20.796875MB)   Metaspace大小——  Metaspace是1.8后出现的,替代perm区
   CompressedClassSpaceSize = 1073741824 (1024.0MB)  CompressedClassSpace大小
   MaxMetaspaceSize         = 52428800 (50.0MB) : 最大 Metaspace大小
   G1HeapRegionSize         = 0 (0.0MB)

 

 

2)查看堆占用:jmap -histo  [pid] | sort -k2 -nr | head -30

 

 num     #instances         #bytes  class name
----------------------------------------------
   2:          2505         354616  [C
   5:          1698          40752  java.lang.String
   3:           677         141992  [B
   6:           580          30632  [Ljava.lang.Object;
   4:           493          56208  java.lang.Class
   1:           443        4639632  [I
  11:           258           4128  java.lang.Integer
  10:           230           5520  java.lang.StringBuilder
   8:           217           6944  java.io.File
  13:           118           3776  java.util.Hashtable$Entry
   7:           115           8280  java.lang.reflect.Field
  12:            98           3920  java.lang.ref.SoftReference
   9:            95           6080  java.net.URL
  17:            91           2184  java.net.Parts
  15:            83           2952  [Ljava.lang.String;
  18:            67           2144  java.util.HashMap$Node
  16:            65           2600  java.lang.ref.Finalizer
  25:            53           1696  java.util.concurrent.ConcurrentHashMap$Node

 

 

(3)dump 堆数据: jmap -dump:format=b,file=heap.hprof [pid]

 

jmap -dump:format=b,file=heap.hprof 1000
Dumping heap to /tmp/heap.hprof ...
Heap dump file created

 

 

四 jhat:html方式查看dump文件分析结果

(1)用法:

Usage:  jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <file>

常用方式:jhat -port 5000 ./heap.hprof 

其中 500 是端口,一般用于本地分析对使用情况,html方式分析dump文件

 

(2)例如:



 

 

五 javap:用于分析class文件

(1)用法:

	用法: javap <options> <classes>
	其中, 可能的选项包括:
	  -help  --help  -?        输出此用法消息
	  -version                 版本信息
	  -v  -verbose             输出附加信息
	  -l                       输出行号和本地变量表
	  -public                  仅显示公共类和成员
	  -protected               显示受保护的/公共类和成员
	  -package                 显示程序包/受保护的/公共类
	                           和成员 (默认)
	  -p  -private             显示所有类和成员
	  -c                       对代码进行反汇编
	  -s                       输出内部类型签名
	  -sysinfo                 显示正在处理的类的
	                           系统信息 (路径, 大小, 日期, MD5 散列)
	  -constants               显示最终常量
	  -classpath <path>        指定查找用户类文件的位置
	  -cp <path>               指定查找用户类文件的位置
	  -bootclasspath <path>    覆盖引导类文件的位置

 

 

(2)举例:

java类:

 

	public class HelloWorld {
	    public static void main(String[] args) {
	        System.out.println("hello world!");
	    }
	}

 

 

查看反编译信息:javap -c HelloWorld ; 可用于执行信息

 

	javap -c HelloWorld
	Compiled from "HelloWorld.java"
	public class HelloWorld {
	  public HelloWorld();
	    Code:
	       0: aload_0
	       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
	       4: return

	  public static void main(java.lang.String[]);
	    Code:
	       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
	       3: ldc           #3                  // String hello world!
	       5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
	       8: return
	}

 

查看附加信息:javap -v HelloWorld;可以看看字节码的处理顺序等

javap -v HelloWorld

	Classfile /Users/shilei/Root/Develop/DevelopSpace/Demo/lucene/target/classes/HelloWorld.class
	  Last modified May 25, 2018; size 534 bytes
	  MD5 checksum e75a26fd4cfa5da79c54f66e06b5cf83
	  Compiled from "HelloWorld.java"
	public class HelloWorld
	  minor version: 0
	  major version: 52
	  flags: ACC_PUBLIC, ACC_SUPER
	Constant pool:
	   #1 = Methodref          #6.#20         // java/lang/Object."<init>":()V
	   #2 = Fieldref           #21.#22        // java/lang/System.out:Ljava/io/PrintStream;
	   #3 = String             #23            // hello world!
	   #4 = Methodref          #24.#25        // java/io/PrintStream.println:(Ljava/lang/String;)V
	   #5 = Class              #26            // HelloWorld
	   #6 = Class              #27            // java/lang/Object
	   #7 = Utf8               <init>
	   #8 = Utf8               ()V
	   #9 = Utf8               Code
	  #10 = Utf8               LineNumberTable
	  #11 = Utf8               LocalVariableTable
	  #12 = Utf8               this
	  #13 = Utf8               LHelloWorld;
	  #14 = Utf8               main
	  #15 = Utf8               ([Ljava/lang/String;)V
	  #16 = Utf8               args
	  #17 = Utf8               [Ljava/lang/String;
	  #18 = Utf8               SourceFile
	  #19 = Utf8               HelloWorld.java
	  #20 = NameAndType        #7:#8          // "<init>":()V
	  #21 = Class              #28            // java/lang/System
	  #22 = NameAndType        #29:#30        // out:Ljava/io/PrintStream;
	  #23 = Utf8               hello world!
	  #24 = Class              #31            // java/io/PrintStream
	  #25 = NameAndType        #32:#33        // println:(Ljava/lang/String;)V
	  #26 = Utf8               HelloWorld
	  #27 = Utf8               java/lang/Object
	  #28 = Utf8               java/lang/System
	  #29 = Utf8               out
	  #30 = Utf8               Ljava/io/PrintStream;
	  #31 = Utf8               java/io/PrintStream
	  #32 = Utf8               println
	  #33 = Utf8               (Ljava/lang/String;)V
	{
	  public HelloWorld();
	    descriptor: ()V
	    flags: ACC_PUBLIC
	    Code:
	      stack=1, locals=1, args_size=1
	         0: aload_0
	         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
	         4: return
	      LineNumberTable:
	        line 7: 0
	      LocalVariableTable:
	        Start  Length  Slot  Name   Signature
	            0       5     0  this   LHelloWorld;

	  public static void main(java.lang.String[]);
	    descriptor: ([Ljava/lang/String;)V
	    flags: ACC_PUBLIC, ACC_STATIC
	    Code:
	      stack=2, locals=1, args_size=1
	         0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
	         3: ldc           #3                  // String hello world!
	         5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
	         8: return
	      LineNumberTable:
	        line 9: 0
	        line 10: 8
	      LocalVariableTable:
	        Start  Length  Slot  Name   Signature
	            0       9     0  args   [Ljava/lang/String;
	}
	SourceFile: "HelloWorld.java"

 

  • 大小: 193.3 KB
  • 大小: 328 KB
0
0
分享到:
评论

相关推荐

    Jenkinsfile调用jdk命令和maven或grandle编译命令工具配置

    Jenkinsfile 文件里定义调用 JDK 的工具命令语法 在 Jenkinsfile 中,我们可以使用以下语法来调用 JDK 命令: ```groovy pipeline { agent any stages { stage('Build') { steps { sh 'jdk命令' } } } } ``...

    Jenkinsfile调用jdk命令工具配置

    本文将详细讲解如何在 Jenkinsfile 中调用 JDK 命令工具,并在 Jenkins 容器中进行相应的配置,以实现无需安装完整 JDK 环境即可执行 JDK 相关任务。 1. **容器内放置 JDK 工具包** Jenkins 容器通常是一个轻量级...

    jdk命令详解,jdk,很全

    JDK 中提供了许多实用的工具和命令,这些命令都位于 JDK 的 bin 目录下,每个命令都可以使用“-help”选项来查看帮助信息。 1. javadoc 命令 javadoc 命令是一个 Java API 文档生成器,能够从 Java 源文件生成 API...

    jdk常用命令

    12. **jcmd**:Java命令工具,用于在JDK 1.7及更高版本中执行诊断操作。 13. **jrunscript**:运行JavaScript或其他支持的脚本语言,利用Java平台的功能。 14. **keytool**:管理密钥和证书,用于创建和管理...

    java—JDK内置工具使用技巧详解

    ### JDK内置工具使用技巧详解 #### 一、引言 JDK(Java Development Kit)作为Java编程语言的核心组件,不仅提供了必要的编译、调试及文档工具,还配备了一系列用于监控和诊断应用程序运行状态的工具。本文将详细...

    windows快速切换jdk版本工具

    在这个场景下,它可能详细解释了如何配置和使用这个工具,包括设置JDK路径、执行切换命令以及可能出现的问题及解决方案。 在实际使用中,用户首先需要将所有JDK安装目录添加到系统路径,然后根据`readme.txt`的指示...

    java卸载工具 jdk卸载工具 官方卸载工具 干净

    1. **选择正确的版本**:确保使用与要卸载的JDK版本对应的卸载工具。不同版本的JDK可能需要不同版本的卸载工具。 2. **关闭相关程序**:在执行卸载前,最好关闭所有与Java相关的应用程序,以防止冲突。 3. **遵循...

    JDK版本切换工具

    5. **验证版本切换**:使用`java -version`或`javac -version`命令检查当前激活的JDK版本,确保切换成功。 6. **自动化切换**:一些工具还支持在特定目录下自动切换JDK版本,这在多项目开发环境下非常有用。只需在...

    jdk命令行工具.doc

    jvm命令行工具,java性能优化,jdk命令工具, jcmd命令、jps命令、jmap命令、jstack命令、jinfo命令、jstat命令

    jdk8工具包

    - 开发者可以使用JDK 8提供的`javac`编译器将源代码编译成字节码,然后通过`java`命令运行程序。 - 利用新的Stream API进行集合操作,例如过滤、映射、归约等,实现更加优雅的代码风格。 - 使用lambda表达式简化...

    JDK常用命令.pdf

    虽然这些实践并非直接与JDK命令相关,但是这些JDK工具在实现这些实践的过程中起着关键作用。例如,开发者可以在CI系统中配置JDK工具来自动化编译、打包、测试等步骤。 综上所述,JDK命令是Java开发的基础,贯穿整个...

    jdk命令详解

    JDK 是 Java 开发工具包,包含了开发和运行 Java 应用所需的各种工具。本文将详细解析 JDK 中的几个重要命令:rmic、rmid 和 ...在实际开发中,理解并正确使用这些命令能极大地提高 RMI 应用的效率和可靠性。

    JDK一些查询工具

    本文将深入探讨JDK中的一些重要查询工具,帮助开发者更好地理解和使用这些工具。 **1. Javadoc** Javadoc是JDK内置的一个文档生成工具,用于自动生成Java源代码的API文档。它通过解析源代码中的注释,生成HTML格式...

    JAVAJDK使用教程

    对于Android开发,还需掌握如何使用Android Studio中的JDK工具,如构建工具Gradle,以及如何调试和测试Android应用。 在**JDK文档**中,官方的Java SE文档是非常宝贵的资源,它详尽地解释了类库的API、JVM规范和...

    一键切换jdk版本工具

    - "切换JDK版本.bat":这是一个批处理文件,包含了切换JDK版本的命令和逻辑。用户根据描述中的指示修改其中的JDK路径后,执行此文件即可完成版本切换。 - "RefreshEnv.exe":这是一个可能用于刷新系统环境变量的小...

    JDK环境变量配置工具

    使用这个工具时,你需要确保你对JDK的安装位置有准确的了解,并且在运行批处理脚本时正确输入路径。尽管没有图形界面,但这种方式依然比手动编辑环境变量更有效率,尤其对于需要在多个项目间切换,每个项目可能依赖...

    JDK21 开发工具包!!!

    **JDK21 开发工具包详解** JDK(Java Development Kit)是Oracle公司发布的用于开发和运行Java应用程序的重要工具集。JDK21作为Java的最新版本,它包含了Java编译器、Java运行时环境、Java调试工具以及其他必要的...

    JDK工具包(Mac)

    本篇文章将详细解析“JDK工具包(Mac)”,包括JDK 11的运行环境和API文档的安装与使用。 首先,让我们了解JDK 11。JDK 11是Java SE(标准版)平台的第15个长期支持版本,发布于2018年9月。它引入了许多新特性,如...

    JDK11-tools-reference.pdf

    2. JDK工具命令:详细介绍了JDK工具的命令行参数、选项和使用方法。 3. JDK工具配置:讲解了JDK工具的配置选项、环境变量和配置文件的使用方法。 4. JDK工具Troubleshooting:提供了常见问题和解决方案,帮助开发者...

    JDK配置程序,一键配置安装JDK

    - 为避免版本冲突,建议仅安装一个JDK版本,或使用工具(如SDKMAN!)管理多个版本。 总结,JDK配置程序提供了一种快速简便的方式安装和配置JDK,使得开发者可以省去手动设置环境变量的麻烦,更专注于Java编程本身...

Global site tag (gtag.js) - Google Analytics