jdk 工具命令总结
1、jps 是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用 -l 是显示主类 ,若是jar包,则显示包名 -v 是启动时传递给虚拟机的参数 -m 是启动时传递给main方法的参数 2、jstat Jstat是JDK自带的一个轻量级小工具。全称“Java Vi
这些命令行工具大多数是lib\tools.jar类库的一层薄包装而已,他们主要的功能代码是在tools类库中实现的。
tools.jar中的类库不属于Java的标准API,如果引入这个类库,就意味着你的程序只能运行在Sun Hotspot(或一些从Sun买了JDK源码License的虚拟机,如IBM J9、BEAJRockit)上面,或者在部署程序时需要一起部署tools.jar。
主要有 jps、jinfo、jstat、jmap、jstack、jdb、jconsole、jvisualvm、jstatd
远程配置:需要在服务器端配置调试选项
java -Djava.rmi.server.hostname=10.22.1.96 -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false baby.Main
注意:一般来说需要配置java.rmi.server.hostname属性,配置位服务器的ip地址,剩下的是端口
1、jps
是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用
图1.1
-l 是显示主类 ,若是jar包,则显示包名
-v 是启动时传递给虚拟机的参数
-m 是启动时传递给main方法的参数
图1.2
2、jstat
Jstat是JDK自带的一个轻量级小工具。全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。可见,Jstat是轻量级的、专门针对JVM的工具,非常适用。由于JVM内存设置较大,图中百分比变化不太明显,所以用命令方式进行查看。
jstat工具特别强大,有众多的可选项,详细查看堆内各个部分的使用量,以及加载类的数量。使用时,需加上查看进程的进程id,和所选参数。
执行:cd $JAVA_HOME/bin中执行jstat,注意jstat后一定要跟参数。
jstat :对VM内存使用量进行监控。
jstat -class pid:显示加载class的数量,及所占空间等信息。
jstat -compiler pid:显示VM实时编译的数量等信息。
jstat -gc pid:可以显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。
jstat -gccapacity:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是当前perm内存占用量。其他的可以根据这个类推, OC是old内存的占用量 单位为 K。
jstat -gcnew pid:new对象的信息。
jstat -gcnewcapacity pid:new对象的信息及其占用量。
jstat -gcold pid:old对象的信息。
jstat -gcoldcapacity pid:old对象的信息及其占用量。
jstat -gcpermcapacity pid: perm对象的信息及其占用量。
jstat -gcutil pid:统计gc信息统计。
jstat -printcompilation pid:当前VM执行的信息。
除了以上一个参数外,还可以同时加上 两个数字,如:jstat -printcompilation 2932 250 6是每250毫秒打印一次,一共打印6次,还可以加上-h3每三行显示一下标题。
语法结构:
Usage: jstat -help|-options
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
参数解释:
Options — 选项,我们一般使用 -gcutil 查看gc情况
vmid — VM的进程号,即当前运行的java进程号
interval– 间隔时间,单位为秒或者毫秒
count — 打印次数,如果缺省则打印无数次
S0 — Heap上的 Survivor space 0 区已使用空间的百分比
S1 — Heap上的 Survivor space 1 区已使用空间的百分比
E — Heap上的 Eden space 区已使用空间的百分比
O — Heap上的 Old space 区已使用空间的百分比
P — Perm space 区已使用空间的百分比
YGC — 从应用程序启动到采样时发生 Young GC 的次数
YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
FGC — 从应用程序启动到采样时发生 Full GC 的次数
FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)
S0C:年轻代中第一个survivor(幸存区)的容量 (K)
S1C:年轻代中第二个survivor(幸存区)的容量 (K)
S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (K)
S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (K)
EC:年轻代中Eden(伊甸园)的容量 (K)
EU:年轻代中Eden(伊甸园)目前已使用空间 (K)
OC:Old代的容量 (K)
OU:Old代目前已使用空间 (K)
PC:Perm(持久代)的容量 (K)
PU:Perm(持久代)目前已使用空间 (K)
YGC:从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
FGC:从应用程序启动到采样时old代(全gc)gc次数
FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)NGCMN:年轻代(young)中初始化(最小)的大小 (K)
NGCMX:年轻代(young)的最大容量(K)
NGC:年轻代(young)中当前的容量 (K)
OGCMN:old代中初始化(最小)的大小 (K)
OGCMX:old代的最大容量 (K)
OGC:old代当前新生成的容量 (K)
PGCMN:perm代中初始化(最小)的大小 (K)
PGCMX:perm代的最大容量 (K)
PGC:perm代当前新生成的容量 (K)
S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E:年轻代中Eden(伊甸园)已使用的占当前容量百分比
O:old代已使用的占当前容量百分比
P:perm代已使用的占当前容量百分比
S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (K)
S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (K)
ECMX:年轻代中Eden(伊甸园)的最大容量 (K)
DSS:当前需要survivor(幸存区)的容量 (K)(Eden区已满)
TT: 持有次数限制
MTT : 最大持有次数限制
实例2.1:
jstat -gcutil 2932 2
图2.1
其中,2931 为pid,1000 为间隔(毫秒) 2 为次数
实例2.2:
jstat -class 2932 显示加载class的数量,及所占空间等信息。
图2.2
实例2.3:
jstat -gccapacity 2932
VM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是当前perm内存占用量。其他的可以根据这个类推, OC是old内存的占用量。 单位为 K
图2.3.1
图2.3.2
实例2.4:
jstat -gcnew 2932
C capacity 容量 u use 已使用的
图2.4
实例2.5:
jstat -gcold 2932
3
图2.5
3、jinfo
观察运行中的java程序的运行环境参数:参数包括Java System属性和JVM命令行参数
http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jinfo.html
图3.1
3.1 输出java进程 环境信息
图3.2
3.2 查看 vm 命令行参数 ,查看,修改参数
图3.3
4、jmap
打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)。
可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。使用方法 jmap -histo pid。如果连用SHELL jmap -histo pid>a.log可以将其保存到文本中去,在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。jmap -dump:format=b,file=outfile 3024可以将3024进程的内存heap输出出来到outfile文件里,再配合MAT(内存分析工具(Memory Analysis Tool)或与jhat (Java Heap Analysis Tool)一起使用,能够以图像的形式直观的展示当前内存是否有问题。
使用:
图4.1
说明:
-dump:[live,]format=b,file=<filename> 使用hprof二进制形式,输出jvm的heap内容到文件=. live子选项是可选的,假如指定live选项,那么只输出活的对象到文件.
-finalizerinfo 打印正等候回收的对象的信息.
-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况.
-histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量.
-permstat 打印classload和jvm heap长久层的信息. 包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来.
-F 强迫.在pid没有相应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效.
-h | -help 打印辅助信息
-J 传递参数给jmap启动的jvm.
-heap:打印jvm heap的情况
-histo:打印jvm heap的直方图。其输出信息包括类名,对象数量,对象占用大小。
-histo:live :同上,但是只答应存活对象的情况
-permstat:打印permanent generation heap情况
实例4.1:
jap -heap 2832 (windows 系统)
图4.2
jmap -heap 4285 (linux 系统)
图4.3
注意:上图中用的的垃圾收集器,以及所使用的虚拟机
实例:4.2
jmap -histo 2832
图4.4
图4.5
图4.6
实例:4.3
jmap -dump:format=b,file=test.bin 2832
图4.7
5、jstack
http://docs.oracle.com/javase/6/docs/technotes/tools/share/jstack.html
如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。
该命令打印java线程的堆栈跟踪,可以得知哪些线程被阻塞或正等待,以便于查找如线程死锁的原因
用法:
图5.1
-F:强制产生一个线程dump
-m:打印java和native frames
-l:打印关于锁的附加信息
实例5.1:
jstack -l 4260 > Desktop\histo.txt
图5.2
图5.3
图5.4
6、JDB
JDB是基于文本和命令行的调试工具(例如Sun JDB);虽然现在有一些很好的调试工具,然而 Java调试器 (JDB)提供了一些优点。最重要的是 JDB可以免费获取并且是平台独立的。其缺点是它只有命令行格式,一些开发人员认为这很原始,而且难以使用。一些 IDE已经将 GUI界面构建到 JDB调试 API(如 Jikes)。JDB是 JDK安装的一部分。
http://docs.oracle.com/javase/1.3/docs/tooldocs/solaris/jdb.html
7、jconsole
jconsole是基于Java Management Extensions (JMX)的实时图形化监测工具,这个工具利用了内建到JVM里面的JMX指令来提供实时的性能和资源的监控,包括了Java程序的内存使用,Heap size, 线程的状态,类的分配状态和空间使用等等。
命令行中输入 jconsole
看图:
图7.1 选择java进程
图7.2 概要
图7.3 内存
图7.4 线程
图7.5 类
图7.6 VM摘要
图7.7 M bean
8、jvisualvm
在jdk1.6 中 Oracle 提供了一个新的可视化的。 JVM 监控工具 Java VisualVM 。 jvisualvm.exe 在JDK 的 bin 目录下。
命令行中输入 jvisualvm
插件安装
tools->plugin->Available Plugin 会有值得安装的插件,如:VisualGC JConsole
看图:
图8.1 主页
图8.2 插件安装
图8.3 概述
图8.4 线程总览
图8.5 线程明细
图8.6 抽样器
图8.7 Visual Gc
图8.8 heapdump
图8.9 heapdump 类以及类实例
图8.10 线程dump
9、jstatd
http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstatd.html
此命令是一个RMI Server应用程序,提供了对JVM的创建和结束监视,也为远程监视工具提供了一个可以attach的接口
options
-nr 当一个存在的RMI Registry没有找到时,不尝试创建一个内部的RMI Registry
-p port 端口号,默认为1099
-n rminame 默认为JStatRemoteHost;如果多个jstatd服务开始在同一台主机上,rminame唯一确定一个jstatd服务
-J jvm选项
(1)使用内部RMI Registry
jstatd -J-Djava.security.policy=all.policy (默认端口为1099)
(2)使用外部RMI Registry
a)使用默认值
rmiregistry&
jstatd -J-Djava.security.policy=all.policy
b)使用2020端口
rmiregistry 2020&
jstatd -J-Djava.security.policy=all.policy -p 2020
c)使用2020端口,使用rminame
rmiregistry 2020&
jstatd -J-Djava.security.policy=all.policy -p 2020 -n AlternateJstatdServerName
(3)RMI Registry已经启动,不创建内部RMI Registry
jstatd -J-Djava.security.policy=all.policy -nr
(4)RMI日志能力
jstatd -J-Djava.security.policy=all.policy -J-Djava.rmi.server.logCalls=true
远程监控
1. 服务器端通过jstatd启动RMI服务
确保 hostname -i 显示的不是 127.0.0.1 ,如果是的话,需要修改/etc/hosts 文件,修改配置成显示外部IP
配置java安全访问,将如下的代码存为文件 jstatd.all.policy ,其内容如下,
grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission;};
grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission;};
执行命令 jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=10.22.1.96 &
(10.22.1.96 为你服务器的ip地址,&表示用守护线程的方式运行) 相对路径
2、客户端 打开jvisualvm, 右键Remort,选择 "Add Remort Host...",在弹出框中输入你的远端IP,比如10.22.1.96. 连接成功.
2. 配置JMX管理tomcat
打开Tomcat的bin/catalina.bat,如果为linux或unix系统,则为catalina.sh文件 。
无限制访问
set JAVA_OPTS=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9008 -Dcom.sun.management.jmxremote.authenticate=false - Dcom.sun.management.jmxremote.ssl=false
需要用户名和密码访问
JAVA_OPTS='-Xms128m -Xmx256m -XX:MaxPermSize=128m
-Djava.rmi.server.hostname=192.168.1.8
-Dcom.sun.management.jmxremote.port=8088
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.password.file=/usr/java/default/jre/lib/management/jmxremote.password
-Dcom.sun.management.jmxremote.access.file=/usr/java/default/jre/lib/management/jmxremote.access'
(jmxremote.access 在JAVA_HOME\jre\lib\management下有模板)
jmxremote.access 中显示
monitorRole readonly
controlRole readwrite
jmxremote.password中显示
monitorRole QED (QED为密码)
controlRole R&D
重新在visualvm中打开远程tomcat就可以使用JMX带来的功能了
更多推荐
所有评论(0)