文档章节

Java自带的性能监测工具用法简介——jstack、jconsole、jinfo、jmap、jdb、jsta、jvisualvm

HJCui
 HJCui
发布于 2017/02/17 11:11
字数 2476
阅读 8
收藏 0
点赞 0
评论 0

JDK内置工具使用

一、javah命令(C Header and Stub File Generator)

二、jps命令(Java Virtual Machine Process Status Tool)

三、jstack命令(Java Stack Trace)

四、jstat命令(Java Virtual Machine Statistics Monitoring Tool)

五、jmap命令(Java Memory Map)

六、jinfo命令(Java Configuration Info)

七、jconsole命令(Java Monitoring and Management Console)

八、jvisualvm命令(Java Virtual Machine Monitoring, Troubleshooting, and Profiling Tool)

九、jhat命令(Java Heap Analyse Tool)

十、Jdb命令(The Java Debugger)

1、介绍

jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使用方式只支持以下的这种方式:

jstack [-l] pid

如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。

2、命令格式
jstack [ option ] pid
jstack [ option ] executable core
jstack [ option ] [server-id@]remote-hostname-or-IP

3、常用参数说明

1)、options: 

executable Java executable from which the core dump was produced.

(可能是产生core dump的java可执行程序)

core 将被打印信息的core dump文件

remote-hostname-or-IP 远程debug服务的主机名或ip

server-id 唯一id,假如一台主机上多个远程debug服务 

2)、基本参数:

-F当’jstack [-l] pid’没有相应的时候强制打印栈信息

-l长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.

-m打印java和native c/c++框架的所有栈信息.

-h | -help打印帮助信息

pid 需要被打印配置信息的java进程id,可以用jps查询.

4、使用示例

 

 

一、jstatd 
启动jvm监控服务。它是一个基于rmi的应用,向远程机器提供本机jvm应用程序的信息。默认端口1099。 
实例:jstatd -J-Djava.security.policy=my.policy 

my.policy文件需要自己建立,内如如下: 

Java代码  收藏代码

  1. grant codebase "file:${java.home}/../lib/tools.jar" {  
  2.  permission java.security.AllPermission;  
  3. };  


这是安全策略文件,因为jdk对jvm做了jaas的安全检测,所以我们必须设置一些策略,使得jstatd被允许作网络操作 

二、jps 
列出所有的jvm实例 
实例: 
jps 
列出本机所有的jvm实例 

jps 192.168.0.77 
列出远程服务器192.168.0.77机器所有的jvm实例,采用rmi协议,默认连接端口为1099 
(前提是远程服务器提供jstatd服务) 

输出内容如下: 
jones@jones:~/data/ebook/java/j2se/jdk_gc$ jps 
6286 Jps 
6174  Jstat 

详细请看连接:http://www.blogjava.net/aoxj/archive/2007/12/29/171447.html 

三、jconsole 

用法: jconsole [ -interval=n ] [ -notile ] [ -pluginpath  ] [ -version ] [ connection ...] 

  -interval   将更新间隔时间设置为 n 秒(默认值为 4 秒) 
  -notile     最初不平铺显示窗口(对于两个或更多连接) 
  -pluginpath 指定 jconsole 用于查找插件的路径 
  -version    输出程序版本 

  connection = pid || host:port || JMX URL (service:jmx:://...) 

  pid       目标进程的进程 ID 
  host      远程主机名或 IP 地址 
  port      用于远程连接的端口号 

  -J          对正在运行 jconsole 的 Java 虚拟机指定输入参数 

在cmd中输入命令:jconsole 3980[java进程号] 弹出下图 



四、jinfo 
用法: 
jinfo [ option ] pid 
jinfo [ option ] executable core 
jinfo [ option ] [server-id@]remote-hostname-or-IP 

参数: 

pid   进程号 
executable   产生core dump的java executable 
core   core file 
remote-hostname-or-IP  主机名或ip 
server-id    远程主机上的debug server的唯一id 

选项: 
no option  打印命令行参数和系统属性 
-flags  打印命令行参数 
-sysprops  打印系统属性 
-h  帮助 

观察运行中的java程序的运行环境参数:参数包括Java System属性和JVM命令行参数 
实例: 
jinfo 2083 
其中2083就是java进程id号,可以用jps得到这个id号。我在windows上尝试输入这个命令,但是不管用,于是我输入了下面这个命令: 
jinfo -flag MaxPermSize 3980 
显示如下: 
-XX:MaxPermSize=67108864 

五、jstack 
该命令应该如何使用呢?首先需要用jstack命令产生java进程的dump文件,然后分析dump文件中的数据,下面的连接是一篇讲述如何分析jstack产生的dump文件数据的文章,写的非常不错: 
http://www.blogjava.net/jzone/articles/303979.html 

六、jmap(linux下特有,也是很常用的一个命令) 
观察运行中的jvm物理内存的占用情况。 
参数如下: 
-heap:打印jvm heap的情况 
-histo:打印jvm heap的直方图。其输出信息包括类名,对象数量,对象占用大小。 
-histo:live :同上,但是只答应存活对象的情况 
-permstat:打印permanent generation heap情况 

命令使用: 
jmap -heap 2083 
可以观察到New Generation(Eden Space,From Space,To Space),tenured generation,Perm Generation的内存使用情况 

jmap -histo 2083 | jmap -histo:live 2083 
可以观察heap中所有对象的情况(heap中所有生存的对象的情况)。包括对象数量和所占空间大小。 

jmap -histo java进程id 
可以查看java进程中的所有实例、实例的个数,可用于查询单例对象是否真的只生成了一个实例。 

在控制台,输入命令“jmap -histo 7329 > histo_dump”,得到如下结果: 

Java代码  收藏代码

  1. num     #instances         #bytes  class name  
  2. ---------------------------------------------  
  3.   1:        605348       68849960  [C  
  4.   2:       1609734       51511488  java.util.concurrent.ConcurrentHashMap$Segment  
  5.   3:       1610022       38640528  java.util.concurrent.locks.ReentrantLock$NonfairSync  
  6.   4:         70784       31478168  [I  
  7.   5:        218224       27628072  <constMethodKlass>  
  8.   6:       1609734       26423552  [Ljava.util.concurrent.ConcurrentHashMap$HashEntry;  
  9.   7:         40379       24430792  [B  
  10.   8:        218224       19211544  <methodKlass>  
  11.   9:        602848       14468352  java.lang.String  
  12.  10:         19374       11640184  <constantPoolKlass>  
  13.  11:        236950       11451216  <symbolKlass>  
  14.  12:        283746       11349840  java.util.concurrent.ConcurrentHashMap$ValueIterator  
  15.  13:         19374        8826272  <instanceKlassKlass>  
  16.  14:        100613        8048728  [Ljava.util.concurrent.ConcurrentHashMap$Segment;  
  17.  15:         85036        7332664  [Ljava.lang.Object;  
  18.  16:         15559        6614824  <constantPoolCacheKlass>  
  19.  17:         78919        6313520  java.lang.reflect.Method  
  20.  18:        103377        4962096  com.sun.tools.javac.zip.ZipFileIndexEntry  
  21.  19:         51998        4324096  [Ljava.util.HashMap$Entry;  
  22.  20:        100613        4024520  java.util.concurrent.ConcurrentHashMap  
  23.  21:        157136        3771264  java.util.concurrent.ConcurrentHashMap$HashEntry  
  24.  22:         35932        3736928  com.asiainfo.dbm.core.bean.monitor.FlowService  
  25.  23:         35932        3736928  com.asiainfo.dbm.core.bean.monitor.FlowService  



七、jstat 
最后要重点介绍下这个命令,这是jdk命令中比较重要,也是相当实用的一个命令,可以观察到classloader,compiler,gc相关信息。 
具体参数如下: 
-class:统计class loader行为信息 
-compile:统计编译行为信息 
-gc:统计jdk gc时heap信息 
-gccapacity:统计不同的generations(不知道怎么翻译好,包括新生区,老年区,permanent区)相应的heap容量情况 
-gccause:统计gc的情况,(同-gcutil)和引起gc的事件 
-gcnew:统计gc时,新生代的情况 
-gcnewcapacity:统计gc时,新生代heap容量 
-gcold:统计gc时,老年区的情况 
-gcoldcapacity:统计gc时,老年区heap容量 
-gcpermcapacity:统计gc时,permanent区heap容量 
-gcutil:统计gc时,heap情况 
-printcompilation:不知道干什么的,一直没用过。 

一般比较常用的几个参数是: 

Java代码  收藏代码

  1. jstat -class 27629 3000 10 //每隔1秒监控一次,一共做10次  


输出内容含义如下: 

Loaded Bytes Unloaded Bytes Time
49955 49701.5    35528 32456.1      34.71
49955 49701.5    35528 32456.1      34.71
49955 49701.5    35528 32456.1      34.71
49955 49701.5    35528 32456.1      34.71
49963 49708.8    35528 32456.1      34.71
49963 49708.8    35528 32456.1      34.71
49963 49708.8    35528 32456.1      34.71
49971 49716.1    35528 32456.1      34.71
49971 49716.1    35528 32456.1      34.71
49971 49716.1    35528 32456.1      34.71



jstat -gc 2083 2000 20(每隔2秒监控一次,共做10) 
输出内容含义如下: 

S0C Current survivor(存活的) space 0 capacity (KB).
EC Current eden space capacity (KB).
EU Eden space utilization (KB).
OC Current old space capacity (KB).
OU Old space utilization (KB).
PC Current permanent space capacity (KB).
PU Permanent space utilization (KB).
YGC Number of young generation GC Events.
YGCT Young generation garbage collection time.
FGC Number of full GC events.
FGCT Full garbage collection time.
GCT Total garbage collection time.



监控内存使用情况 参数 (查看内存溢出相对有用) 
jstat -gccause 2083 5000 (每隔5秒监控一次) 
输出内容含义如下: 

S0 Survivor space 0 utilization as a percentage of the space's current capacity.
S1 Survivor space 1 utilization as a percentage of the space's current capacity.
E Eden space utilization as a percentage of the space's current capacity.
O Old space utilization as a percentage of the space's current capacity.
P Permanent space utilization as a percentage of the space's current capacity.
YGC Number of young generation GC events.
YGCT Young generation garbage collection time.
FGC Number of full GC events.
FGCT Full garbage collection time.
GCT Total garbage collection time.
LGCC Cause of last Garbage Collection.
GCC Cause of current Garbage Collection.



八、jvisualvm 
java visualvm 是visualvm的一个针对java vm的发布版本。 关于visualvm的更多信息可以访问 visualvm.java.net.jvisualvm 工具从jdk 6 update7 (apple的java 是从 mac os x 10.5 update 4)之后,默认就已经存在jdk工具里。 
java visualvm是一个稳定的工具,用每一个jdk发布版本测试过。 最新的jdk请到oracle(sun)公司的网上进行下载。

jvisualvm 的功能及ui比jconsole还要强大。我们先来看下jvisualvm的用法。 他是一个gui(图形界面)的工具,所以上手应该会很快。 

官网上关于jvisualvm的用法介绍 http://docs.oracle.com/javase/6/docs/technotes/tools/share/jvisualvm.html 

简单来说,我们不需要传递任何参数就可以启动jvisualvm。 

我们可以把jvisualvm也放到jdk的path里, 然后加到环境的path里。 这时候我们在windows的运行或者cmd里运行 
jvisualvm就可以启动该工具了。 或者我们直接双击点击该软件 
在cmd中输入命令:jvisualvm 弹出下图 


具体用法可以参考下面这个链接:http://www.iteye.com/topic/516447 

下面我们来讲解如何利用visualvm对远程的主机进行监控 
首先,我们可以在用户目录下的任何地方(比如说:用户根目录,或者是jdk根目录)新建一个名称为jstatd.all.policy的文件,文件内容如下: 

Java代码  收藏代码

  1. grant codebase "file:${java.home}/../lib/tools.jar" {     
  2.   permission java.security.AllPermission;     
  3. };  



新建完文件后,我们给这个文件赋予执行权限,命令如下: 

Java代码  收藏代码

  1. chmod 755 jstatd.all.policy  



然后,我们在我们运行如下命令,启动jstatd服务(jstatd服务的默认端口为1099): 

Java代码  收藏代码

  1. jstatd -J-Djava.security.policy=/sw/bes/jstatd.all.policy  


记住jstatd.all.policy文件必须为绝对路径,防止出现java.security.AccessControlException: access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write)错误。 

最后,我们可以用jps命令查看是否启动成功: 

Java代码  收藏代码

  1. jps -l  


得到如下结果: 

  • 9481 com.bes.enterprise.ee.nodeagent.NodeAgentMain
  • 7329 com.bes.enterprise.server.Entry
  • 18968 com.bes.enterprise.server.Entry
  • 15802 sun.tools.jstatd.Jstatd
  • 16075 sun.tools.jps.Jps
  • 9328 com.bes.enterprise.server.Entry

本文转载自:

HJCui
粉丝 6
博文 109
码字总数 80137
作品 0
朝阳
程序员
JVM调优工具的使用(jps,jstat,jstack,jmap,jhat)

JDK本身提供了很丰富的性能监控工具,除了集成式的visualVM和jConsole外,还有jstat,jstack,jps,jmap,jhat小工具,这些都是性能调优的常用工具 我们在Java的开发中,常常会遇到下面这些问题:...

super李导 ⋅ 昨天 ⋅ 0

JVM性能调优实践——JVM篇

前言 在遇到实际性能问题时,除了关注系统性能指标。还要结合应用程序的系统的日志、堆栈信息、GClog、threaddump等数据进行问题分析和定位。关于性能指标分析可以参考前一篇JVM性能调优实践...

lijingyao8206 ⋅ 05/24 ⋅ 0

JVM汇总--jvm调优-命令篇

GC的最根本原因:垃圾收集器的工作就是清除Java创建的对象,垃圾收集器需要清理的对象数量以及要执行的GC数量均取决于已创建的对象数量。因此,为了使你的系统在GC上表现良好,首先需要减少创...

素雷 ⋅ 04/12 ⋅ 0

JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jstat

jstack -- 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具...

anfield ⋅ 2010/12/02 ⋅ 5

JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, js...

jstack -- 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具...

老大做IT ⋅ 2013/05/02 ⋅ 0

JVM(Thread/Stack)

JVM Thread/Stack Memory Size JVM Thread/Stack Object states (6 states) Dump OS Thread/Stack OS的线程运行状态 Iuput(top): Output: or input(ps): Dump Thread/Stack Analysis 注意thr......

赵-猛 ⋅ 2016/10/12 ⋅ 0

LINUX类主机JAVA应用程序占用CPU、内存过高分析手段

转载声明:本文为DBA+社群原创文章,转载必须连同本订阅号二维码全文转载,并注明作者名字及来源:DBA+社群(dbaplus)。 做为一个IT运维人员,通常在运维过程中会遇到各种各样的问题,系统问...

丁启良 ⋅ 2015/12/04 ⋅ 0

JDK自带监控工具

系统在生产运行过程中最重要的工作莫过于监控与问题的处理,监控是预防问题产生很重要的手段。在监控过程中可以发现那些模块或进程出现了问题,出现问题后会及时通知问题负责人。 实现监控的...

引鸩怼孑 ⋅ 2016/03/21 ⋅ 0

JVM性能调优监控工具jps、jstack、jstat、jmap、jinfo使用详解

是什么 jps 查看所有的jvm进程,包括进程ID,进程启动的路径等等。 我自己也用PS,即:ps -ef | grep java jstack 观察jvm中当前所有线程的运行情况和线程当前状态。 系统崩溃了?如果java程...

xionghuiCoder ⋅ 2015/08/13 ⋅ 0

Java内存溢出如何处理

背景介绍 新建Java对象时会在JVM的Heap中分配内存,对象不可达时其内存会被JVM GC回收, 但是当Heap中没有多余内存可供分配时,就会报OutOfMemory错误(以下简称OOM): 解决方法 解决方式很简...

Arthur126 ⋅ 2016/07/20 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

对于程序员的招聘问题,作为软件人的一些吐槽和建议

作为软件人,找工作有时候似乎挺苦逼的。 说真的,让我去掉前面这句中“似乎”二字吧。就是苦逼!很多人都曾抱怨处在招聘的一方很糟糕——我们没有任何可靠的方式来甄别会写代码并且写得好的...

老道士 ⋅ 11分钟前 ⋅ 0

HDFS原理学习

一、概述 1、 Hadoop整合了众多的文件系统,首先提供了一个高层的文件系统抽象org.apache.hadoop.fs.FileSystem。然后有各个文件系统的实现类。 2、Hadoop是JAVA编写的,不同文件系统之间的交...

cjxcloud ⋅ 15分钟前 ⋅ 0

Linux下MySQL表名不区分大小写的设置方法(抄袭别人的)

Linux下MySQL表名不区分大小写的设置方法 MySQL表名不区分大小写的设置方法 在用centox安装mysql后,把项目的数据库移植了过去,发现一些表的数据查不到,排查了一下问题,最后发现是表名的大...

随风而浮沉 ⋅ 20分钟前 ⋅ 0

ubuntu下安装宋体simsun

sudo cp simsun.ttc /usr/share/fonts cd /usr/share/fonts sudo chmod 644 simsun.ttc 更新字体缓存: 代码: sudo mkfontscale 代码: sudo mkfontdir 代码: sudo fc-cache -fsv 安装chrome扩......

wangxuwei ⋅ 21分钟前 ⋅ 0

利用 ssh 传输文件

Linux 下一般可以用 scp 命令通过 ssh 传送文件: #把服务器上的 /home/user/a.txt 发送到本机的 /var/www/local_dir 目录下scp username@servername:/home/user/a.txt /var/www/local_dir...

大灰狼时间 ⋅ 31分钟前 ⋅ 0

web3j教程:android和java程序员如何使用web3j开发区块链以太坊

如何使用web3j为Java应用或Android App增加以太坊区块链支持,本教程内容即涉及以太坊中的核心概念,例如账户管理包括账户的创建、钱包创建、交易转账,交易与状态、智能合约开发与交互、过滤...

智能合约 ⋅ 53分钟前 ⋅ 0

web3j开发java或android以太坊智能合约快速入门

web3j简介 web3j是一个轻量级、高度模块化、响应式、类型安全的Java和Android类库提供丰富API,用于处理以太坊智能合约及与以太坊网络上的客户端(节点)进行集成。 可以通过它进行以太坊区块链...

笔阁 ⋅ 56分钟前 ⋅ 0

一起读书《深入浅出nodejs》-异步I/O

异步I/O “异步”这个名词其实很早就诞生了,但它大规模流行却是在Web 2.0浪潮中,它伴随着AJAX的第一个A(Asynchronous)席卷了Web。 为什么要异步I/O 关于异步I/O为何在Node里如此重要,这与...

小草先森 ⋅ 58分钟前 ⋅ 0

JVM各种问题

1、如果启动什么都不设,会怎样? 先来看一个命令 [root@localhost bin]# java -XX:+PrintCommandLineFlags -version -XX:InitialHeapSize=29899008 -XX:MaxHeapSize=478384128 -XX:+PrintCo......

算法之名 ⋅ 今天 ⋅ 0

SAS笔记-宏2

宏是一种文本,一般来说其编译是在程序执行之前。 宏变量的创建 %let语句 %let macro_variables = text; %let是常见的宏变量建立方式,其编译就在执行前。如下例中,想要宏变量test等于数据集...

tonorth123 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部