`

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
分享到:
评论

相关推荐

    JDK开发工具命令集合

    JDK开发工具

    Jenkinsfile调用jdk命令工具配置

    Jenkinsfile调用jdk命令工具配置

    jdk命令行工具.doc

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

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

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

    jdk常用命令

    NULL 博文链接:https://jose-bing.iteye.com/blog/1271185

    jdk 一键配置环境工具

    注意在Windows下,为了避免在使用命令行的时候出现问题,一般不要选择安装在C:\Program Files\jdk目录下,可以选择文件夹名没有空格的目录来安装,比如我一般安装在C:\Java目录下面。 1. 设置JAVA_HOME,指向jdk的...

    jdk证书安装工具

    有时候会因为不信任而导致请求失败,这个时候又不想让jdk信任所有请求,那就只能给jdk安装目标地址的证书让jdk信任目标地址,但是正常的通过命令提示符安装证书非常麻烦,所以就做了这个工具,只要选择jdk目录和要安装的...

    jdk-7u45-windows-i586_版本的安装描述

    》 bin :该路径下存放了 JDK 的各种工具命令,常用的 编译和运行 java程序的 javac 、java 等命令就放在该路径下。 》 db :该路径下安装的是 Java DB 的路径。 》 demo :该路径下存放了 JDK 提供的演示代码,初学...

    远程连接工具,支持SFTP,FTP 需要自带jdk环境

    远程连接工具,支持SFTP,FTP 需要自带jdk环境 该平台类似于网页版的Xshell,基于cookie和json的方式存储登录信息无数据库更方便兼容每个用户的使用,支持SFTP和FTP两种登录方式,打破原有黑端显示命令行和文件名的...

    JDK提供的常用工具.。。。。

    JDK提供的常用工具.就是在CMD运行JDK时可用的命令。。。。。

    linux 32位的jdk8,版本:jdk-8u221-linux-i586.rpm

    使用ftp工具将jdk-8u191-linux-i586.rpm传至linux系统,移动到/usr/local下,chmod 755 jdk-8u191-linux-i586.rpm 赋权,使用rpm -ivh jdk-8u191-linux-i586.rpm安装配置环境变量,vi /etc/profile,在末尾(就是最...

    jdk1.8linux和win安装包

    安装完成后,用户可以使用 javac 命令编译 Java 程序,使用 java 命令运行 Java 程序。此外,还提供了一些常用的工具,如jar、jconsole等,方便开发人员进行项目开发和调试。 针对 Windows 用户,也可以从官方网站...

    JDK安装文档.docx

    JDK(Java Development Kit)是Java开发工具包,用于开发、测试和运行Java程序。在这篇安装文档中,我们将指导您如何在 Windows 操作系统上安装JDK。 JDK的下载和安装 首先,我们需要下载JDK,下载地址是...

    jdk-6u31-windows-x64

    jdk6.0 64位官方版全称为Java Development Kit,这是由...在打开的命令提示符中输入java -version,看到如下JDK版本,说明JDK安装成功。 至此,JDK1.6的下载、安装、配置全部完成。可以正常使用JDK了。 jdk6.0官方下载

    Java开发工具包jdk-16.rar

    Java开发工具包。全称Java Development Kit。包括两部分:运行环境(即JRE)和开发环境(即JDK)。运行环境包括核心API、集成API、用户界面API、发布技术、Java虚拟机(JVM)5个部分;开发环境包括编译Java程序的...

    jdk8 32位及64位安装包,2个独立安装包,不是一个。安装完系统内显示文件版本8.0.730.2

    jdk_8u73_windows_i586_8.0.730.2和jdk-8u...2、使用CPU命令提高AES加密的性能。 3、删除不常用的垃圾收集器组合。 4、可以将函数用作方法参数,也可以将代码用作数据。 5、使用Unicode CLDR数据改进了本地数据的打包。

    Linux中的jdk8以及安装教程.zip

    3.解压命令:tar-zxvf jdk-版本编号-linux-x64.tar.gz 4.在Linux中配置环境变量: 先 sudo vi /etc/profile 进入了vi编辑模式 然后按下i键 光标移到最后一行 输入下列内容: export JAVA_HOME=/usr/java/jdk/jdk...

    win64位 jdk6,jdk7,jdk8版本 开发工作可以用到,为不方便在官网下载小伙伴分享

    开发Java程序必须有Java开发环境,即Java开发工具包,这个工具包包含了编译、运行、调试等关键命令,哪怕运行Eclipse,NetBeans等开发工具,也要有JDK或JRE的支持,所以开发Java程序之前的第一步准备就是获取JDK JDK...

    Java入门教程 JDK7的下载安装配置全流程教程.docx

    "Java入门教程 JDK7的下载安装配置全流程教程" ...本文详细讲解了JDK7的下载安装配置全流程教程,包括JDK7的下载、安装、配置、环境变量设置、API文档下载等知识点,旨在帮助初学者快速掌握JDK7的使用方法。

    FTP工具(jdk1.6版).rar

    手写Java程序封装ftp命令,操作ftp文件,实现上传和下载,重命名,删除,移动文件等操作

Global site tag (gtag.js) - Google Analytics