`
足至迹留
  • 浏览: 492663 次
  • 性别: Icon_minigender_1
  • 来自: OnePiece
社区版块
存档分类
最新评论

<jmap-1> jmap基本用法和windows下定时任务执行

阅读更多
一、jmap基本用法
jmap(java memory map)是jdk自带的内存详细信息监控工具,jdk6之后在linux,unix或windows上都能使用,但在windows上功能有所限制。jmap在命令行上使用打印出运行的jvm或core文件的内存统计信息。如果不带任何参数单独使用jmap命令,那将打印出共享对象的列表。如果想看到更多指定的信息,可以使用-heap,-histo或-permstat选项。

除此之外,jdk6开始还提供了-dump:format=b,file=fileName的选项,可以dump出内存的使用情况到一个指定文件名的二进制文件中。这个文件可以配合jdk自带的jhat工具或其他第三方工具来分析(jhat对于大的二进制文件分析耗时且响应慢,还有可能内存溢出,个人一般使用第三方mat插件来分析)。

如果jmap pid命令因为pid挂死而无响应,可以使用-F选项强制输出(这个选项只能在Solaris和linux上使用)。

jmap是在Solaris os和linux版本中提供的功能,但jdk6之后的windows版本也提供了,不过只有jmap –dump:format=b,file=fileName和jmap –histo[:live] pid两个选项可以使用。

1.0 jmap命令格式
语法
jmap [ option ] pid
jmap [ option ] executable core
jmap [ option ] [server-id@]remote-hostname-or-IP

参数说明:
1)options:

executable:Java executable from which the core dump was produced.
core: 将被打印信息的core dump文件
remote-hostname-or-IP:远程debug服务的主机名或ip
server-id:唯一id,假如一台主机上多个远程debug服务

2)基本参数:
-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.

pid 需要被打印配相信息的java进程id,创业与打工的区别 - 博文预览,可以用jps查问.

1.1 堆内存配置和使用 -heap
-heap选项可以获取以下heap信息:
1)gc信息,包括gc算法,并行gc使用的线程数等。
2)堆配置。包括jvm中设置的和启动时指定的内存属性配置,如最大最小设置等。
3)堆使用概要。如每一代内存的使用情况。

示例:
$  jmap -heap 29620
输出:
Attaching to process ID 29620, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 1.6.0-rc-b100

using thread-local object allocation.
Mark Sweep Compact GC

Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 67108864 (64.0MB)
   NewSize          = 2228224 (2.125MB)
   MaxNewSize       = 4294901760 (4095.9375MB)
   OldSize          = 4194304 (4.0MB)
   NewRatio         = 8
   SurvivorRatio    = 8
   PermSize         = 12582912 (12.0MB)
   MaxPermSize      = 67108864 (64.0MB)

Heap Usage:
New Generation (Eden + 1 Survivor Space):
   capacity = 2031616 (1.9375MB)
   used     = 70984 (0.06769561767578125MB)
   free     = 1960632 (1.8698043823242188MB)
   3.4939673639112905% used
Eden Space:
   capacity = 1835008 (1.75MB)
   used     = 36152 (0.03447723388671875MB)
   free     = 1798856 (1.7155227661132812MB)
   1.9701276506696428% used
From Space:
   capacity = 196608 (0.1875MB)
   used     = 34832 (0.0332183837890625MB)
   free     = 161776 (0.1542816162109375MB)
   17.716471354166668% used
To Space:
   capacity = 196608 (0.1875MB)
   used     = 0 (0.0MB)
   free     = 196608 (0.1875MB)
   0.0% used
tenured generation:
   capacity = 15966208 (15.2265625MB)
   used     = 9577760 (9.134063720703125MB)
   free     = 6388448 (6.092498779296875MB)
   59.98769400974859% used
Perm Generation:
   capacity = 12582912 (12.0MB)
   used     = 1469408 (1.401336669921875MB)
   free     = 11113504 (10.598663330078125MB)
   11.677805582682291% used
包含堆属性的配置和各个代(HotSpot VM的内存是分代管理)内存的使用统计。


1.2 运行进程的堆直方图统计 -histo
-histo选项可以用来获取基于类名的堆内存统计。可以输出对象实例数量,内存统计和实例对应的类名。如果想获取一个实例的大小,可以使用内存数除以对应的实例个数。
示例:
$  jmap -histo 29620
输出:
num   #instances    #bytes  class name
--------------------------------------
  1:      1414     6013016  [I
  2:       793      482888  [B
  3:      2502      334928  <constMethodKlass>
  4:       280      274976  <instanceKlassKlass>
  5:       324      227152  [D
  6:      2502      200896  <methodKlass>
  7:      2094      187496  [C
  8:       280      172248  <constantPoolKlass>
  9:      3767      139000  [Ljava.lang.Object;
10:       260      122416  <constantPoolCacheKlass>
11:      3304      112864  <symbolKlass>
12:       160       72960  java2d.Tools$3
13:       192       61440  <objArrayKlassKlass>
14:       219       55640  [F
15:      2114       50736  java.lang.String
16:      2079       49896  java.util.HashMap$Entry
17:       528       48344  [S
18:      1940       46560  java.util.Hashtable$Entry
19:       481       46176  java.lang.Class
20:        92       43424  javax.swing.plaf.metal.MetalScrollButton
... more lines removed here to reduce output...
1118:         1           8  java.util.Hashtable$EmptyIterator
1119:         1           8  sun.java2d.pipe.SolidTextRenderer
Total    61297    10152040

排序是按照每类实例使用总内存的降序。其中class name对应的就是Class文件里的class的标识:
B代表byte
C代表char
D代表double
F代表float
I代表int
J代表long
Z代表boolean
S代表short
void用V表示
内部名就是带全包路径的表示法,例如String的内部名是java/lang/String
前边有[代表数组,[I 就相当于int[]


对象用[L+类名表示

1.3 core文件的堆直方图统计
在core文件上使用jmap –histo命令时可以输出每个类的实例个数,大小和名称。HotSpot vm的自身的类名称前面会带前缀*.

示例:
&  jmap -histo /net/koori.sfbay/onestop/jdk/6.0/promoted/all/b100/binaries/ solaris-sparcv9/bin/java core
输出:
Attaching to core core from executable /net/koori.sfbay/onestop/jdk/6.0/
promoted/all/b100/binaries/solaris-sparcv9/bin/java, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 1.6.0-rc-b100
Iterating over heap. This may take a while...
Heap traversal took 8.902 seconds.

Object Histogram:

Size    Count    Class description
-------------------------------------------------------
4151816    2941    int[]
2997816    26403    * ConstMethodKlass
2118728    26403    * MethodKlass
1613184    39750    * SymbolKlass
1268896    2011    * ConstantPoolKlass
1097040    2011    * InstanceKlassKlass
882048    1906    * ConstantPoolCacheKlass
758424    7572    char[]
733776    2518    byte[]
252240    3260    short[]
214944    2239    java.lang.Class
177448    3341    * System ObjArray
176832    7368    java.lang.String
137792    3756    java.lang.Object[]
121744    74    long[]
72960    160    java2d.Tools$3
63680    199    * ObjArrayKlassKlass
53264    158    float[]
... more lines removed here to reduce output...

1.4 获取持久代(方法区)信息 -permstat
持久代存储的是类信息,方法信息,字符串池等。配置持久代内存大小对应用程序动态产生和加载大量类很重要。如果加载的类太多或太多的internalized字符串就可能抛出OutOfMemoryError。
可以使用-permstat选项输出持久代内存的统计信息。示例:
$  jmap -permstat 29620
输出:
Attaching to process ID 29620, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 1.6.0-rc-b100
12674 intern Strings occupying 1082616 bytes.
finding class loader instances ..Unknown oop at 0xd0400900
Oop's klass is 0xd0bf8408
Unknown oop at 0xd0401100
Oop's klass is null
done.
computing per loader stat ..done.
please wait.. computing liveness.........................................done.
class_loader    classes bytes   parent_loader   alive?  type

<bootstrap>     1846 5321080  null        live   <internal>
0xd0bf3828  0      0      null         live    sun/misc/Launcher$ExtClassLoader@0xd8c98c78
0xd0d2f370  1    904      null         dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0c99280  1   1440      null         dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0b71d90  0      0   0xd0b5b9c0    live java/util/ResourceBundle$RBClassLoader@0xd8d042e8
0xd0d2f4c0  1    904      null         dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0b5bf98  1    920   0xd0b5bf38      dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0c99248  1    904      null         dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0d2f488  1    904      null         dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0b5bf38  6   11832  0xd0b5b9c0      dead    sun/reflect/misc/MethodUtil@0xd8e8e560
0xd0d2f338  1    904      null         dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0d2f418  1    904      null         dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0d2f3a8  1    904     null          dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0b5b9c0  317 1397448 0xd0bf3828     live    sun/misc/Launcher$AppClassLoader@0xd8cb83d8
0xd0d2f300  1    904      null         dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0d2f3e0  1    904      null         dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0ec3968  1   1440      null         dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0e0a248  1    904      null         dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0c99210  1    904      null         dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0d2f450  1    904      null         dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0d2f4f8  1    904      null         dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0e0a280  1    904      null         dead    sun/reflect/DelegatingClassLoader@0xd8c22f50

total = 22      2186    6746816   N/A   alive=4, dead=18       N/A  

二、windows下定时执行jmap获取信息
linux下定时任务可以使用cron来实现,windows下倒是费了下工夫,没有在控制面板配置定时任务,觉得使用命令行更好控制些。比如在windows下想定时执行jmap –histo和jmap –dump命令,则可以如下操作:

step1:jmap_histo.bat
set filename=jmap_%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%.txt
echo %filename%

jmap -histo:live 78104 > %filename%
exit


step2:jmap_dump.bat
set filename=jmap_dump_%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%.hprof
echo %filename%

jmap -dump:live,format=b,file=%filename% 78104


step3:task.bat
@echo off

rem 指定要执行的bat文件的路径和名称。
:loop
start /min jmap_histo.bat

rem 900是定时任务执行的间隔时间(单位:秒),这里是15分钟。其他不需要修改。
ping -n 900 127.1> nul
goto loop

参考资料:
http://www.oracle.com/technetwork/java/javase/tooldescr-136044.html
http://docs.oracle.com/javase/6/docs/technotes/tools/share/jmap.html
http://hbluojiahui.blog.163.com/blog/static/31064767201282091643613/
http://developer.51cto.com/art/201203/321422.htm
0
0
分享到:
评论

相关推荐

    JMAP代理服务器jmap-perl.zip

    jmap-perl 是 JMAP 代理服务器的 Perl 实现,Perl JMAP 后端可以与 IMAP 和 SMTP 服务器通许,允许在邮件系统上替换 JMAP 接口。为了高效,初始化实现要求所有服务器支持 CONDSTORE 扩展(RFC4551/FRC7162)。提供一个...

    jvm信息jmap使用的基本方法教程

    本文将详细介绍jmap的使用方法。 ### 前言 在Java性能调优过程中,开发者通常会使用各种开源监控工具,例如VisualVM和jConsole。然而,jmap作为一个轻量级的工具,提供了对JVM内部内存的深入洞察,尤其是对于堆...

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

    JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解 本文将对一些常用的 JVM 性能调优监控工具进行介绍,包括 jps、jstack、jmap、jhat、jstat 等工具的使用详解。这些工具对于 Java 程序员来说是必备的,...

    JMAP的JavaScript客户端JMAP-JS.zip

    JMAP-JS 是 JMAP 邮件,联系人和日历模型的 JavaScript 实现,是 JMAP 的 JavaScript 客户端。 标签:JMAPJS

    JMAP-Server:如http所指定的JMAP服务器的实现

    JMAP服务器 如所指定的JMAP服务器的实现 安装 npm install -g jmap-server 用法 首先启动服务器: jmap-server 然后,您可以在测试一些请求: curl -d "@examples/mailboxes/setMailboxes.json" -H "Content-...

    jmap Eclipse内存分析工具.rar

    在使用过程中,需要注意的是,`jmap`命令通常需要以root权限执行,因为它直接与JVM交互。同时,MAT虽然功能强大,但初次使用可能会有些复杂,需要花时间熟悉其界面和分析报告。 总的来说,结合`jmap`和MAT,开发者...

    jmap -dump:format=b,file=heapdump.hprof Pid堆栈文件分析工具

    `jmap`命令是JDK自带的一个强大工具,它能够帮助开发者深入理解Java应用程序的内存使用情况,尤其是堆内存的分配和垃圾回收。本文将详细讲解如何使用`jmap`中的`-dump:format=b,file=heapdump.hprof`选项来生成堆栈...

    java使用JMAP定位代码内存泄漏在哪

    1. **生成堆转储文件**:通过`jmap -dump:format=b,file=&lt;filename&gt; &lt;pid&gt;`命令,我们可以从运行中的Java进程生成一个heap dump文件,这个文件包含了Java堆内存的所有信息。 2. **查看堆概要**:`jmap -histo:live ...

    codepot-dumps

    jmap -dump:活动,文件= &lt;PATH&gt; &lt;PID&gt;-堆转储 ps -eLf-具有其线程的进程列表 kill -3 &lt;PID&gt;-将线程转储到Java进程标准输出 jstack &lt;PID&gt;-将线程转储到stdout jvisualvm-一切;) top -Hp-进程线程对CPU使用率的...

    JVM问题诊断常用命令

    ### JVM问题诊断常用命令详解 在Java开发与运维过程中,针对JVM(Java虚拟机)进行性能调优、故障排查是非常重要的环节。...掌握这些工具的使用方法,能够帮助我们更高效地定位和解决问题,提高程序的稳定性和性能。

    jmap+EclipseMAT:排查内存泄漏的好工具.pdf

    下面是对这两个工具的详细介绍和使用方法。 Jmap Jmap 是一个命令行工具,用于输出 Java 进程中的内存信息。它可以将虚拟机(VM)中的堆 heap 输出成二进制格式的文件中。Jmap 的主要用途是: 1. 输出堆 heap ...

    查看虚拟机状态常用命令

    本文将详细介绍一些常用的虚拟机状态查看命令,包括`jmap`, `jstat`, `jstat-gcutil`等相关工具的使用方法与应用场景。 #### 1. jmap `jmap` 是一个非常实用的工具,主要用于打印Java堆或永久代中的对象实例。其中...

    JMap-iOS-SDK-Pod

    pod 'JMapiOSSDK' , :git =&gt; 'https://github.com/Jibestream/JMap-iOS-SDK-Pod.git' 对于首次安装,请运行: pod install 要获取最新版本的Pod,请执行以下操作: pod update 作者 路易(Louie),

    使用jmap分析Java程序性能问题

    ### 使用jmap分析Java程序性能问题 在Java开发与维护过程中,经常遇到与内存相关的性能问题及故障。这些问题包括但不限于内存泄漏、频繁的...对于每一个Java开发者来说,掌握jmap的使用方法都是十分必要的技能之一。

    jmap-client-ts:TypeScript中的JMAP 1.0客户端库

    jmap-client-ts 用编写的 Client。 如何使用它 导入项目(在package.json ),您可以引用提交或分支以使用快照版本。 创建客户端 let client = new Client ( { accessToken : 'myToken' , sessionUrl : '...

    jmap工具~MA.zip

    1. **jmap基本用法** jmap主要有以下几种命令选项: - `dump:` 用于生成堆内存的dump文件,格式通常为.hprof,可以供后续工具如MAT(Memory Analyzer Tool)进行深度分析。 - `histo:` 显示堆内存中对象的分布...

    Tomcat教程-JVM相关工具.docx

    本教程将详细解释Tomcat服务器中与JVM相关的几个关键工具,包括它们的功能、使用方法及示例。 1. **jps (Java Virtual Machine Process Status tool)**: jps命令用于列出运行在指定主机上的Java虚拟机进程。通过...

    JVM调优工具命令详解.pdf

    1. jmap -histo &lt;pid&gt;:此命令可以查看历史生成的实例以及它们的数量和占用的内存大小。 2. jmap -histo:live &lt;pid&gt;:此命令用于查看当前存活的实例,执行过程中可能会触发一次Full GC。 当需要对JVM进行内存溢出...

    Kubernetes应用java程序无法使用jmap,jstack的解决方案.docx

    这种情况下,无法获取 Java 进程的 pid,导致无法使用 jmap 和 jstack 命令。 解决方案: 1. 了解 Linux 特殊进程 在 Linux 系统中,有一些特殊的进程,例如 pid=1 的 init 进程、pid=2 的 kthreadd 进程等。这些...

Global site tag (gtag.js) - Google Analytics