`

JDK内置工具

    博客分类:
  • java
阅读更多
在开始介绍之前,先介绍几篇写的比较详细的博客,咱们不求最精,一定最全,最省事。
http://blog.csdn.net/fenglibing/article/details/6411924
一、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. };  
grant codebase "file:${java.home}/../lib/tools.jar" {
 permission java.security.AllPermission;
};

这是安全策略文件,因为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

命令格式:
jstack [ option ] pid
基本参数:
-F当’jstack [-l] pid’没有相应的时候强制打印栈信息
-l长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.
-m打印java和native c/c++框架的所有栈信息.
-h | -help打印帮助信息
pid 需要被打印配置信息的java进程id,可以用jps查询.

具体用法
jstack -l 进程ID


六、jmap(linux下特有,也是很常用的一个命令)
观察运行中的jvm物理内存的占用情况。
Usage:
    jmap [option] <pid>
        (to connect to running process)
    jmap [option] <executable <core>
        (to connect to a core file)
    jmap [option] [server_id@]<remote server IP or hostname>
        (to connect to remote debug server)

where <option> is one of:
    <none>               to print same info as Solaris pmap
    -heap                to print java heap summary
    -histo[:live]        to print histogram of java object heap; if the "live"
                         suboption is specified, only count live objects
    -permstat            to print permanent generation statistics
    -finalizerinfo       to print information on objects awaiting finalization
    -dump:<dump-options> to dump java heap in hprof binary format
                         dump-options:
                           live         dump only live objects; if not specified,
                                        all objects in the heap are dumped.
                           format=b     binary format
                           file=<file>  dump heap to <file>
                         Example: jmap -dump:live,format=b,file=heap.bin <pid>
    -F                   force. Use with -dump:<dump-options> <pid> or -histo
                         to force a heap dump or histogram when <pid> does not
                         respond. The "live" suboption is not supported
                         in this mode.
    -h | -help           to print this help message
    -J<flag>             to pass <flag> directly to the runtime system

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


该命令通常用来分析内存泄漏OOM,通常做法是,首先配置JVM启动参数,让JVM在遇到OutOfMemoryError时自动生成Dump文件:
Java代码 复制代码 收藏代码
  1. -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path  
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path

然后使用命令:
Java代码 复制代码 收藏代码
  1. jmap  -dump:format=b,file=/path/heap.bin 进程ID     
jmap  -dump:format=b,file=/path/heap.bin 进程ID   

如果只dump heap中的存活对象,则加上选项-live,如下:
Java代码 复制代码 收藏代码
  1. jmap  -dump:live,format=b,file=/path/heap.bin 进程ID  
jmap  -dump:live,format=b,file=/path/heap.bin 进程ID

最后在eclipse中安装MAT插件(http://www.eclipse.org/mat/),然后在eclipse中,file---->open,打开这个文件heap.bin,利用现成的OOM工具进行分析。具体操作方法:首先输入网址http://www.eclipse.org/mat/previousReleases.php,然后查看你自己的Eclipse版本,我的是Indigo的,所以点击链接“Previous Releases”,选择Indigo版本的URLhttp://download.eclipse.org/mat/1.1.0/update-site/

七、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次  
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. };  
grant codebase "file:${java.home}/../lib/tools.jar" {   
  permission java.security.AllPermission;   
};


新建完文件后,我们给这个文件赋予执行权限,命令如下:
Java代码 复制代码 收藏代码
  1. chmod 755 jstatd.all.policy  
chmod 755 jstatd.all.policy


然后,我们在我们运行如下命令,启动jstatd服务(jstatd服务的默认端口为1099):
Java代码 复制代码 收藏代码
  1. jstatd -J-Djava.security.policy=/sw/bes/jstatd.all.policy  
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  
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
分享到:
评论

相关推荐

    java—JDK内置工具使用技巧详解

    ### JDK内置工具使用技巧详解 #### 一、引言 JDK(Java Development Kit)作为Java编程语言的核心组件,不仅提供了必要的编译、调试及文档工具,还配备了一系列用于监控和诊断应用程序运行状态的工具。本文将详细...

    takumiCX#technology-talk#JDK内置工具补充1

    JDK内置工具补充1.查看正在运行的JVM的参数返回结果:

    推荐普通开发者学习使用的6个JDK内建工具Java开发Ja

    在Java开发过程中,掌握JDK内置工具是提升效率和优化代码的关键步骤。本文将深入探讨六个对于普通开发者极具价值的JDK内置工具,这些工具在Java开发中的应用广泛且实用,能够帮助开发者提升编程技能,优化工作流程。...

    jdk1.6.2中文化

    总结,JDK 1.6.2的中文化使得中文环境下的开发变得更加友好,而`tools.zip`的重包则为开发者提供了深入理解JDK内置工具的机会。这些知识点对于提升Java开发者的技能和效率至关重要,也是Java学习路径中的重要一环。...

    Jconsole JDK自带的监控程序

    JConsole作为一款免费的JDK内置工具,虽然在功能上无法与一些高级的商业化监控工具相媲美,但凭借其强大的稳定性、易用性和广泛的适用性,在日常开发和运维工作中仍然发挥着不可替代的作用。无论是对于初学者还是...

    JDK一些查询工具

    Javadoc是JDK内置的一个文档生成工具,用于自动生成Java源代码的API文档。它通过解析源代码中的注释,生成HTML格式的文档,使得其他开发者能够清晰地了解类、接口、方法等的用途和用法。例如,压缩包中的`JDK_API_1_...

    JDK 内置实用工具:监视、故障排除.pdf

    **JDK内置实用工具:监视和故障排除** Java Development Kit (JDK) 提供了一系列内置的工具,用于监视和诊断在Java平台上运行的应用程序。其中一个关键的工具是JConsole,这是一个基于Java Management Extensions ...

    java开发工具jdk1.8

    6. ** Nashorn JavaScript引擎**:JDK1.8内置了一个Nashorn JavaScript引擎,允许Java程序与JavaScript代码交互,提升了多语言集成的能力。 7. **并行流(Parallel Streams)**:Stream API支持并行操作,利用多核...

    mac版jdk开发工具和文档

    Java Development Kit (JDK) 是开发和运行Java程序所必需的核心组件,它包含了Java编译器、Java运行环境(JRE)、调试工具和其他必要的开发工具。 在Mac平台上,安装和使用JDK与Windows或Linux略有不同。标题"mac版...

    JDK内置动态代理例子

    在Java开发中,JDK内置的动态代理机制是一种强大的工具,它允许我们在运行时创建具有额外功能的对象。这个“JDK内置动态代理例子”旨在演示如何利用Java的反射API和`java.lang.reflect.Proxy`类来实现类似拦截器的...

    jdk1.8(java开发工具)

    JDK 1.8引入了一个内置的JavaScript引擎Nashorn,使得Java应用程序能够直接运行JavaScript代码,促进了Java与JavaScript之间的交互。 ### 2. JDK 1.8的安装步骤 在安装JDK 1.8时,通常遵循以下步骤: 1. 下载:...

    Java JDK6开发工具

    JDK是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库(rt.jar).不论什么Java应用服务器实质都是内置了某个版本的JDK. 因此掌握 JDK是学好Java的第一步.最主流的JDK是Sun...

    学习使用jdk1.7中内置数据库Derby(一)

    在Java开发环境中,有时我们需要一个轻量级的数据库来快速测试代码或进行原型设计,而JDK 1.7引入的内置数据库Apache Derby就是这样一种工具。这篇教程将带你入门使用Derby,通过两个示例程序——`TestDerbyBasic....

    jdk反编译工具

    本文将深入探讨"jdk反编译工具"这一主题,帮助你了解如何借助此类工具解决无法查看源代码的问题。 首先,让我们了解什么是反编译。反编译是将已编译的计算机程序(通常为字节码或机器码)转换回接近原始源代码的...

    jdk1.8(内置jre).zip

    **Java Development Kit (JDK) 1.8 内置 JRE** JDK(Java Development Kit)是Oracle公司提供的用于开发和运行Java应用程序的核心工具集。JDK 1.8,也被称为Java 8,是Java历史上的一个重要版本,发布于2014年3月18...

    JDK工具包(Mac)

    这些IDE内置了对JDK的支持,可以自动检测和配置JDK环境。如果你更喜欢轻量级的编辑器,如VS Code或Atom,也可以通过插件实现对Java的支持,并关联到已安装的JDK。 5. **模块系统(Project Jigsaw)** JDK 11中的...

    Android开发工具之jdk

    Android Studio,作为官方推荐的集成开发环境(IDE),内置了基于JDK的工具链,包括Gradle构建系统,它使用Java编写的插件来管理项目依赖和构建过程。 开发者在编写Android应用时,会使用到JDK的语法特性,如类、对象...

    JDK自带调试工具doc

    在Java开发过程中,JDK提供了一系列内置的调试工具,这些工具对于优化性能、排查问题以及理解JVM(Java虚拟机)内部运作至关重要。本篇将详细介绍JDK自带的几个主要调试工具,包括`jmap`、`jstack`、`jconsole`,...

    jdk自带工具

    在Java开发中,JDK(Java Development Kit)不仅仅提供了运行Java程序所需的JRE(Java Runtime Environment),还内置了一系列强大的工具,这些工具对于开发者进行程序调试、性能优化、内存分析以及理解Java源码等...

Global site tag (gtag.js) - Google Analytics