编写不易,转载请注明(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"
相关推荐
JDK开发工具
Jenkinsfile调用jdk命令工具配置
jvm命令行工具,java性能优化,jdk命令工具, jcmd命令、jps命令、jmap命令、jstack命令、jinfo命令、jstat命令
Jenkinsfile调用jdk命令和maven或grandle编译命令工具配置
NULL 博文链接:https://jose-bing.iteye.com/blog/1271185
注意在Windows下,为了避免在使用命令行的时候出现问题,一般不要选择安装在C:\Program Files\jdk目录下,可以选择文件夹名没有空格的目录来安装,比如我一般安装在C:\Java目录下面。 1. 设置JAVA_HOME,指向jdk的...
有时候会因为不信任而导致请求失败,这个时候又不想让jdk信任所有请求,那就只能给jdk安装目标地址的证书让jdk信任目标地址,但是正常的通过命令提示符安装证书非常麻烦,所以就做了这个工具,只要选择jdk目录和要安装的...
》 bin :该路径下存放了 JDK 的各种工具命令,常用的 编译和运行 java程序的 javac 、java 等命令就放在该路径下。 》 db :该路径下安装的是 Java DB 的路径。 》 demo :该路径下存放了 JDK 提供的演示代码,初学...
远程连接工具,支持SFTP,FTP 需要自带jdk环境 该平台类似于网页版的Xshell,基于cookie和json的方式存储登录信息无数据库更方便兼容每个用户的使用,支持SFTP和FTP两种登录方式,打破原有黑端显示命令行和文件名的...
JDK提供的常用工具.就是在CMD运行JDK时可用的命令。。。。。
使用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,在末尾(就是最...
安装完成后,用户可以使用 javac 命令编译 Java 程序,使用 java 命令运行 Java 程序。此外,还提供了一些常用的工具,如jar、jconsole等,方便开发人员进行项目开发和调试。 针对 Windows 用户,也可以从官方网站...
JDK(Java Development Kit)是Java开发工具包,用于开发、测试和运行Java程序。在这篇安装文档中,我们将指导您如何在 Windows 操作系统上安装JDK。 JDK的下载和安装 首先,我们需要下载JDK,下载地址是...
jdk6.0 64位官方版全称为Java Development Kit,这是由...在打开的命令提示符中输入java -version,看到如下JDK版本,说明JDK安装成功。 至此,JDK1.6的下载、安装、配置全部完成。可以正常使用JDK了。 jdk6.0官方下载
Java开发工具包。全称Java Development Kit。包括两部分:运行环境(即JRE)和开发环境(即JDK)。运行环境包括核心API、集成API、用户界面API、发布技术、Java虚拟机(JVM)5个部分;开发环境包括编译Java程序的...
jdk_8u73_windows_i586_8.0.730.2和jdk-8u...2、使用CPU命令提高AES加密的性能。 3、删除不常用的垃圾收集器组合。 4、可以将函数用作方法参数,也可以将代码用作数据。 5、使用Unicode CLDR数据改进了本地数据的打包。
3.解压命令:tar-zxvf jdk-版本编号-linux-x64.tar.gz 4.在Linux中配置环境变量: 先 sudo vi /etc/profile 进入了vi编辑模式 然后按下i键 光标移到最后一行 输入下列内容: export JAVA_HOME=/usr/java/jdk/jdk...
开发Java程序必须有Java开发环境,即Java开发工具包,这个工具包包含了编译、运行、调试等关键命令,哪怕运行Eclipse,NetBeans等开发工具,也要有JDK或JRE的支持,所以开发Java程序之前的第一步准备就是获取JDK JDK...
"Java入门教程 JDK7的下载安装配置全流程教程" ...本文详细讲解了JDK7的下载安装配置全流程教程,包括JDK7的下载、安装、配置、环境变量设置、API文档下载等知识点,旨在帮助初学者快速掌握JDK7的使用方法。
手写Java程序封装ftp命令,操作ftp文件,实现上传和下载,重命名,删除,移动文件等操作