JDK内置工具使用

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进程IDcore file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64"Windowsjstack使用方式只支持以下的这种方式:

jstack [-l] pid

果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stacknative stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stacknative 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 dumpjava可执行程序)

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

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

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

2)、基本参数:

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

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

-m打印javanative 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mall整合RabbitMQ实现延迟消息

摘要 本文主要讲解mall整合RabbitMQ实现延迟消息的过程&#xff0c;以发送延迟消息取消超时订单为例。RabbitMQ是一个被广泛使用的开源消息队列。它是轻量级且易于部署的&#xff0c;它能支持多种消息协议。RabbitMQ可以部署在分布式和联合配置中&#xff0c;以满足高规模、高可…

竞价打板的关键点

竞价打板&#xff0c;主要是速度&#xff0c;其他不重要的&#xff0c;如果为了当天盈利大&#xff0c;失去竞价打板的本质含义&#xff0c;因为竞价可以买到&#xff0c;盘中买不到&#xff0c;才是竞价打板的目的&#xff0c;也就是从竞价打板的角度看&#xff0c;主要是看习…

Java常见的几种内存溢出及解决方法

Java常见的几种内存溢出及解决方法【情况一】&#xff1a;java.lang.OutOfMemoryError:Javaheapspace&#xff1a;这种是java堆内存不够&#xff0c;一个原因是真不够&#xff08;如递归的层数太多等&#xff09;&#xff0c;另一个原因是程序中有死循环&#xff1b;如果是java…

docker操作之mysql容器

1、创建宿主机器的挂载目录 /opt/docker/mysql/conf /opt/docker/mysql/data /opt/docker/mysql/logs 2、创建【xxx.cnf】配置文件&#xff0c;内容如下所示&#xff1a; [mysqld]#服务唯一Idserver-id 1port 3306log-error /var/log/mysql/error.log #只能用IP地址skip_nam…

Windows10系统下wsappx占用CPU资源过高?wsappx是什么?如何关闭wsappx进程?

在Windows10系统开机的时候&#xff0c;wsappx进程占用的CPU资源非常高&#xff0c;导致电脑运行速度缓慢&#xff0c;那么我们如何关闭wsappx进程&#xff0c;让电脑加快运行速度呢&#xff1f;下面就一起来看一下操作的方法吧。 【现象】 1、先来看一下电脑刚开机的时候&…

如何通过Windows Server 2008 R2建立NFS存储

如何通过Windows Server 2008 R2建立NFS存储在我们日常工作的某些实验中&#xff0c;会需要使用存储服务器。而硬件存储成本高&#xff0c;如StarWind之类的iSCSI软存储解决方案需要单独下载服务器端程序&#xff0c;且配置比较繁琐&#xff0c;令很多新手们很是头疼。事实上&a…

python-windows安装相关问题

1.python的环境配置&#xff0c;有些时候是没有配置的&#xff0c;需要在【系统环境】-【path】里添加。 2.安装pip&#xff1a;从官网下载pip包&#xff0c;然后到包目录》python setup.py install 安装 3.安装scrapyd&#xff1a;正常使用pip3 install scrapyd安装不起&…

hdu 1542/1255 Atlantis/覆盖的面积

1542 1255 两道扫描线线段树的入门题。 基本没有什么区别&#xff0c;前者是模板&#xff0c;后者因为是求覆盖次数至少在两次以上的&#xff0c;这个同样是具有并集性质的&#xff0c;所以把cover的判断条件更改一下就可以了qwq。 hdu1542 代码如下&#xff1a; #include<i…

使用了JDK自带的jconsole查看Tomcat运行情况

最近对公司的项目进行JVM调优&#xff0c;使用了JDK自带的jconsole查看Tomcat运行情况&#xff0c;记录下配置以便以后参考&#xff1a;首先&#xff0c;修改Tomcat的bin目录下的catalina.bat文件&#xff0c;在JAVA_OPTS变量中添加下面四行&#xff0c;即可set JAVA_OPTS %JAV…

jvm02

java虚拟机内存管理 每个线程就是一个顺序的执行单元&#xff0c;线程共享区即多个线程共享同一块区域&#xff0c;线程独占区即每个线程都有自己的虚拟机栈&#xff0c;本地方法栈&#xff0c;程序计数器。 程序计数器是一个比较小的内存空间&#xff0c;可以看作是当前线程所…

搭建svn管理平台

安装svn服务器&#xff1a;yum -y install subversion创建svn的目录&#xff1a;mkdir -p /data/svn初始化svn目录&#xff1a;svnadmin create /data/svnconf下的三个目录介绍&#xff1a;authz&#xff1a;控制权限,创建用户。密码在passwd创建 passwd&#xff1a;密码文件&…

Oracle dataguard 正常切换和应急切换

Oracle dataguard 正常切换和应急切换oracle dataguard提供异地容灾方案,能有效的防止单点故障和提供高可用技术,这里介绍dataguard正常主备切换和应急切换&#xff08;应急切换模拟主库出现问题无法还原,备库脱离dataguard接管主库对外提供服务&#xff09;1&#xff09;Oracl…

好程序员web前端分享JS引擎的执行机制

好程序员web前端分享JS引擎的执行机制&#xff0c;请先着重牢记两点&#xff01;JS是单线程语言。JS的EventLoop是JS的执行机制。深入了解JS的执行&#xff0c;就等于深入了解JS里的eventloop。1、灵魂三问&#xff1a;JS为什么是单线程的?为什么需要异步?单线程又是如何实现…

shutil模块、json和pickle模块

shutil模块&#xff1a; 高级的文件、文件夹、压缩包处理模块 json和pickle模块 之前学过eval内置方法可以将一个字符串转化成Python对象&#xff0c;但eval方法是有局限性的&#xff0c;对于普通的数据类型&#xff0c;json.loads、eval都可以使用&#xff0c;但遇到特殊类型的…

每日一问:LayoutParams 你知道多少?

前面的文章中着重讲解了 View 的测量流程。其中我提到了一句非常重要的话&#xff1a;**View 的测量匡高是由父控件的 MeasureSpec 和 View 自身的 LayoutParams 共同决定的。**我们在前面的 每日一问&#xff1a;谈谈对 MeasureSpec 的理解 把 MeasureSpec 的重点进行了讲解&a…

kuangbin专题十六 KMP扩展KMP HDU2594 Simpsons’ Hidden Talents

Homer: Marge, I just figured out a way to discover some of the talents we weren’t aware we had. Marge: Yeah, what is it? Homer: Take me for example. I want to find out if I have a talent in politics, OK? Marge: OK. Homer: So I take some politician’s na…

SNI: 实现多域名虚拟主机的SSL/TLS认证

为什么80%的码农都做不了架构师&#xff1f;>>> 一. 介绍 早期的SSLv2根据经典的公钥基础设施PKI(Public Key Infrastructure)设计&#xff0c;它默认认为&#xff1a;一台服务器&#xff08;或者说一个IP&#xff09;只会提供一个服务&#xff0c;所以在SSL握手时…

echo(),print(),print_r(),var_dump()的区别

echo可以一次输出多个值&#xff0c;多个值之间用逗号分隔。echo是语言结构(language construct)&#xff0c;而并不是真正的函数&#xff0c;因此不能作为表达式的一部分使用。echo是php的内部指令&#xff0c;不是函数&#xff0c;无返回值。 print()&#xff1a;函数print()…

我心目中的牛程序员、我们可以对比看看(人家还是看多年朋友面子上才肯帮忙1周,至少需支付1万元辛苦费)...

为什么80%的码农都做不了架构师&#xff1f;>>> 最近碰到客户整个网站改版的需要&#xff0c;非常短的时间里只有1周时间里&#xff0c;需要把整个B2C网站彻底的进行版面&#xff0c;我自己估算了一下&#xff0c;就是往死里干一天工作48个小时&#xff0c;1周也干…

c#做端口转发程序支持正向连接和反向链接

3389的时候 例子1&#xff1a;连接a机器的3389端口连不上&#xff0c;因为对方防火墙或者网关做了限制&#xff0c;只能访问a机器的个别端口比如80。 例子2&#xff1a;连接a机器的几乎所有端口都连不上&#xff08;对方乃内网或者防火墙网关做了限制&#xff09;&#xff0c…