jmap的使用

目录

一、介绍

二、命令格式

 三、使用实例

1、jmap  pid

2、jmap -heap 6800

3、jmap -histo 6800

4、jmap -histo:live 6800

5、jmap -clstats 6800

6、jmap -finalizerinfo 6800

7、jmap -dump:live,format=b,file=G:\heap.bin 6800



一、介绍

  •  jmap,Java Memory Map。主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节。
  • jmap命令可以获得运行中的jvm的堆的快照,从而可以离线分析堆,以检查内存泄漏,检查一些严重影响性能的大对象的创建,检查系统中什么对象最多,各种对象所占内存的大小等等。可以使用jmap生成Heap Dump。
  •  简单来说—>监控内存内的Java对象。

二、命令格式

  • 语法:
jmap [option] <pid>
  • 说明:

 1、pid:进程id

 2、option:命令选项,常用选项如下:

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
    -clstats             to print class loader 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>

  (1)-heap: 打印Java堆概要信息,包括使用的GC算法、堆配置参数和各代中堆内存使用情况;

  (2)-histo:打印Java堆中对象直方图,通过该图可以获取每个class的对象数目,占用内存大小和类全名信息;

          -histo:live :打印jvm heap的直方图,但是只统计存活对象的情况;

  (3) -clstatst:(1.8以后从-permsta改为-clstatst)打印 类加载器(永久代)统计信息;

  (4) -finalizerinfo: 打印等待回收的对象信息;

  (5) -dump:<dump-options> :以hprof二进制格式将Java堆信息输出到文件内,该文件可以用MAT、VisualVMjhat等工具查看

dump-options选项:

       ① live 只输出活着的对象;不指定,则输出堆中所有对象

       ② format=b 指定输出格式为二进制

       ③ file=<file> 指定文件名及文件存储位置,例如:jmap -dump:live,format=b,file=G:\heap.bin <pid>

    -F -dump:<dump-options> <pid>-histo<pid>一起使用,当<pid>没有响应时,强制执行;注意:不支持live子选项。


 三、使用实例

步骤:

1、运行如下代码:

public class Test {
	
	public static void main(String[] args) {
		while(true) {
		}
	}
}

2、在cmd.exe中执行jps命令获取进程id:选择id=6800

C:\Users\Van>jps
10000
14224 Bootstrap
5904 Launcher
6800 Test
7104 Test
5044 Test
13736 Test
14808 Jps
10972

3、执行jmap pid命令

1、jmap <none> pid

C:\Users\Van>jmap 6800
Attaching to process ID 6800, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 25.131-b11
0x00cc0000      204K    G:\Program_files\Java\jdk1.8.0_131\bin\javaw.exe
0x548d0000      3896K   G:\Program_files\Java\jdk1.8.0_131\jre\bin\client\jvm.dll
0x5a880000      76K     G:\Program_files\Java\jdk1.8.0_131\jre\bin\zip.dll
0x5a8a0000      132K    G:\Program_files\Java\jdk1.8.0_131\jre\bin\java.dll
0x5a8d0000      48K     G:\Program_files\Java\jdk1.8.0_131\jre\bin\verify.dll
0x5a8e0000      32K     C:\Windows\SYSTEM32\WSOCK32.dll
0x5a8f0000      764K    G:\Program_files\Java\jdk1.8.0_131\jre\bin\msvcr100.dll
0x71e10000      2104K   C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.15063.1058_none_887484c43e23e7c3\COMCTL32.dll
0x72c70000      140K    C:\Windows\SYSTEM32\WINMMBASE.dll
0x72dd0000      144K    C:\Windows\SYSTEM32\WINMM.dll
0x74110000      32K     C:\Windows\SYSTEM32\VERSION.dll
0x74260000      40K     C:\Windows\System32\CRYPTBASE.dll
0x74270000      128K    C:\Windows\System32\SspiCli.dll
0x743e0000      756K    C:\Windows\System32\msvcrt.dll
0x744a0000      768K    C:\Windows\System32\RPCRT4.dll
0x74560000      24K     C:\Windows\System32\PSAPI.DLL
0x74570000      484K    C:\Windows\System32\msvcp_win.dll
0x745f0000      2272K   C:\Windows\System32\combase.dll
0x74c50000      228K    C:\Windows\System32\cfgmgr32.dll
0x74ec0000      560K    C:\Windows\System32\shcore.dll
0x74f50000      476K    C:\Windows\System32\ADVAPI32.dll
0x74fd0000      1264K   C:\Windows\System32\USER32.dll
0x751a0000      19748K  C:\Windows\System32\SHELL32.dll
0x764f0000      1376K   C:\Windows\System32\gdi32full.dll
0x76650000      412K    C:\Windows\System32\WS2_32.dll
0x76830000      260K    C:\Windows\System32\sechost.dll
0x76940000      64K     C:\Windows\System32\profapi.dll
0x76950000      832K    C:\Windows\System32\KERNEL32.DLL
0x76a20000      1796K   C:\Windows\System32\KERNELBASE.dll
0x76d80000      148K    C:\Windows\System32\IMM32.DLL
0x76e90000      132K    C:\Windows\System32\GDI32.dll
0x76ec0000      56K     C:\Windows\System32\kernel.appcore.dll
0x76fd0000      348K    C:\Windows\System32\bcryptPrimitives.dll
0x77030000      88K     C:\Windows\System32\win32u.dll
0x77050000      5660K   C:\Windows\System32\windows.storage.dll
0x775e0000      276K    C:\Windows\System32\shlwapi.dll
0x77630000      276K    C:\Windows\System32\powrprof.dll
0x77680000      1120K   C:\Windows\System32\ucrtbase.dll
0x777a0000      1592K   C:\Windows\SYSTEM32\ntdll.dll

2、jmap -heap 6800

C:\Users\Van>jmap -heap 6800
Attaching to process ID 6800, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 25.131-b11

using thread-local object allocation.
Mark Sweep Compact GC

Heap Configuration:#堆内存初始化配置
   MinHeapFreeRatio         = 40  #-XX:MinHeapFreeRatio设置JVM堆最小空闲比率  
   MaxHeapFreeRatio         = 70  #-XX:MaxHeapFreeRatio设置JVM堆最大空闲比率 
   MaxHeapSize              = 268435456 (256.0MB) #-XX:MaxHeapSize=设置JVM堆的最大大小
   NewSize                  = 5570560 (5.3125MB)  #-XX:NewSize=设置JVM堆的‘新生代’的默认大小
   MaxNewSize               = 89456640 (85.3125MB) #-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小

   OldSize                  = 11206656 (10.6875MB) #-XX:OldSize=设置JVM堆的‘老生代’的大小
   NewRatio                 = 2 #-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
   SurvivorRatio            = 8 #-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值
   MetaspaceSize            = 12582912 (12.0MB) # metaspace,元数据空间,专门用来存元数据的,它是jdk8里特有的数据结构用来替代perm(永久代)
   CompressedClassSpaceSize = 1073741824 (1024.0MB) #-XX:CompressedClassSpaceSize=设置Klass Metaspace的大小,
   MaxMetaspaceSize         = 4294901760 (4095.9375MB) #用于设置metaspace区域的最大值,这个值可以通过mxbean中的MemoryPoolBean获取到,如果这个参数没有设置,那么就是通过mxbean拿到的最大值是-1,表示无穷大。
   G1HeapRegionSize         = 0 (0.0MB) #-XX:G1HeapRegionSize=n,使用G1时Java堆会被分为大小统一的的区(region)。此参数可以指定每个heap区的大小. 默认值将根据 heap size 算出最优解. 最小值为 1Mb, 最大值为 32Mb.

Heap Usage:
New Generation (Eden + 1 Survivor Space): #新生代区内存分布,包含伊甸园区+1个Survivor区
   capacity = 5046272 (4.8125MB)
   used     = 1044400 (0.9960174560546875MB)
   free     = 4001872 (3.8164825439453125MB)
   20.696466619318183% used
Eden Space: #Eden区内存分布
   capacity = 4521984 (4.3125MB)
   used     = 1044400 (0.9960174560546875MB)
   free     = 3477584 (3.3164825439453125MB)
   23.096056951992754% used
From Space: #其中一个Survivor区的内存分布
   capacity = 524288 (0.5MB)
   used     = 0 (0.0MB)
   free     = 524288 (0.5MB)
   0.0% used
To Space: #另一个Survivor区的内存分布
   capacity = 524288 (0.5MB)
   used     = 0 (0.0MB)
   free     = 524288 (0.5MB)
   0.0% used
tenured generation: #当前的Old区内存分布  
   capacity = 11206656 (10.6875MB)
   used     = 0 (0.0MB)
   free     = 11206656 (10.6875MB)
   0.0% used

1621 interned Strings occupying 129144 bytes. 

3、jmap -histo 6800

C:\Users\Van>jmap -histo 6800

 num     #instances         #bytes  class name
----------------------------------------------
   1:          3701         499368  [C
   2:           467         229680  [I
   3:           192          77200  [B
   4:           512          50096  java.lang.Class
   5:          2643          42288  java.lang.String
   6:           588          32184  [Ljava.lang.Object;
   7:           835          26720  java.util.TreeMap$Entry
   8:           214           7736  [Ljava.lang.String;
   9:           115           7360  java.lang.reflect.Field
  10:            65           4160  java.net.URL
  11:           258           4128  java.lang.Integer
  12:           226           3616  java.lang.StringBuilder

...
Total         11563        1044400

class name列出现了[C、[B、[L等很奇怪的内容,这些属于非自定义类,具体为:

BaseType Character

Type

Interpretation

B

byte

signed byte

C

char

Unicode character

D

double

double-precision floating-point value

F

float

single-precision floating-point value

I

int

integer

J

long

long integer

L;

reference

an instance of class

S

short

signed short

Z

boolean

true or false

[

reference

one array dimension

4、jmap -histo:live 6800

C:\Users\Van>jmap -histo:live 6800

 num     #instances         #bytes  class name
----------------------------------------------
   1:          2253         292624  [C
   2:           512          50096  java.lang.Class
   3:            17          34208  [B
   4:          2111          33776  java.lang.String
   5:           557          30240  [Ljava.lang.Object;
   6:           835          26720  java.util.TreeMap$Entry
   7:           195           7280  [Ljava.lang.String;
   8:            79           5056  java.lang.reflect.Field
   9:           256           4096  java.lang.Integer
  10:            61           3904  java.net.URL
  11:            93           3616  [I
  12:            95           3040  java.lang.ref.SoftReference

...
Total          8159         535392

5、jmap -clstats 6800

C:\Users\Van>jmap -clstats 6800
Attaching to process ID 6800, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 25.131-b11
finding class loader instances ..done.
computing per loader stat ..done.
please wait.. computing liveness................................................................done.
class_loader    classes bytes   parent_loader   alive?  type

<bootstrap>     441     690035    null          live    <internal>
0x09dba908      0       0         null          live    sun/misc/Launcher$ExtClassLoader@0x15498f70
0x09dc09a8      7       17424   0x09dba908      live    sun/misc/Launcher$AppClassLoader@0x15498780

total = 3       448     707459      N/A         alive=3, dead=0     N/A

6、jmap -finalizerinfo 6800

C:\Users\Van>jmap -finalizerinfo 6800
Attaching to process ID 6800, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 25.131-b11
Number of objects pending for finalization: 0

7、jmap -dump:live,format=b,file=G:\heap.bin 6800

C:\Users\Van>jmap -dump:live,format=b,file=G:\heap.bin 6800

Dumping heap to G:\heap.bin ...

Heap dump file created

此文件可以用jhat来解析:

jhat用于分析产生的堆文件,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言。

步骤:

1、如上述所示导出堆文件;

2、分析堆文件

   jhat -J-Xmx512m <heap dump file> 解析Java堆转储文件并启动一个 web server

   说明:有时dump出来的堆文件很大,在启动时报堆空间不足的错误添加-J-Xmx512M参数

C:\Users\Van> jhat -J-Xmx512m G:\heap.bin
Reading from G:\heap.bin...
Dump file created Sun Jul 21 17:42:16 CST 2019
Snapshot read, resolving...
Resolving 7939 objects...
Chasing references, expect 1 dots.
Eliminating duplicate references.
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

3查看html在浏览器中输入主机地址:端口号

 说明:

 All classes including platform 显示所有创建堆中对象的类

Show all members of the rootset 显示rootset能引用到的所有对象

Show instance counts for all classes (including platform) 显示所有类(包括JDK中定义的Java类)的实例数量

Show instance counts for all classes (excluding platform) 显示所有类(不包括JDK中定义的Java类)的实例数量

Show heap histogram 显示堆内对象直方图

Show finalizer summary 显示等待回收的对象信息

Execute Object Query Language (OQL) query 执行对象查询语句

 

<think>好的,我现在需要详细解释jmap命令的用法和参数。首先,用户已经提供了一些引用资料,我需要仔细阅读这些引用内容,确保准确理解每个参数的作用和命令的适用场景。 首先,根据引用[2]和[3],jmap的主要功能是生成堆转储快照(dump文件)、查看堆和方法区的详细信息,以及finalize执行队列。引用[4]提到jmap还可以分析内存泄漏和大对象,这需要体现在应用场景部分。 接下来,我需要整理各个参数。引用[1]中的示例是jmap -dump:format=b,file=heapdump.hprof pid,说明-dump选项的用法。引用[4]还提到了其他参数如-finalizerinfo和-heap,需要详细说明每个参数的作用。 需要注意格式要求:行内数学公式用$...$,独立公式用$$...$$。不过在这个问题中可能涉及数学公式较少,但如果有相关例子可能需要应用。另外,要使用中文回答,结构清晰,分步骤说明。 用户的问题是关于jmap使用方法和参数详解,因此需要按功能分类参数,并给出具体示例。例如,生成dump文件、查看堆信息、类加载器统计等。 还要注意引用标注的正确使用,在相关解释后添加对应的引用标记,如[^2][^3][^4]。 然后需要生成相关问题。根据用户提供的示例,问题应围绕jmap的进一步应用、参数差异、使用注意事项等展开。 最后,确保回答符合系统级指令,特别是LaTeX语法正确和引用正确。检查是否有遗漏的参数或错误的信息,比如不同JDK版本中jmap的变化是否需要提及?引用中没有提到版本差异,可能不需要涉及,保持现有信息即可。</think>### jmap命令详解 jmap(Java Virtual Machine Memory Map)是JDK提供的用于分析Java堆内存的工具,支持生成堆转储快照、查看内存分布及垃圾回收信息。以下是主要参数及用法: --- #### **1. 生成堆转储文件(Heap Dump)** **命令格式** ```bash jmap -dump:[live,]format=b,file=<filename> <pid> ``` - **作用**:生成堆内存快照,用于离线分析内存泄漏或对象分布。 - **参数说明**: - `live`:仅导出存活对象(会触发Full GC)[^2][^4]。 - `format=b`:二进制格式。 - `file=<filename>`:输出文件名(如`heapdump.hprof`)。 - **示例**: ```bash jmap -dump:live,format=b,file=heapdump.hprof 1234 ``` --- #### **2. 查看堆内存摘要** **命令格式** ```bash jmap -heap <pid> ``` - **作用**:显示堆内存配置、使用情况及垃圾回收器类型。 - **输出内容**: - 堆的分代(新生代/老年代)空间分配。 - 垃圾回收算法(如Parallel GC、G1 GC)。 - 当前内存使用率。 --- #### **3. 查看类实例统计** **命令格式** ```bash jmap -histo[:live] <pid> ``` - **作用**:统计类实例数量和内存占用。 - **参数说明**: - `live`:仅统计存活对象[^4]。 - **输出示例**: ``` num #instances #bytes class name 1: 1000000 200000000 java.lang.String ``` --- #### **4. 查看等待终结的对象** **命令格式** ```bash jmap -finalizerinfo <pid> ``` - **作用**:显示`finalize()`方法队列中的对象数量[^4]。 --- #### **5. 查看类加载器数据** **命令格式** ```bash jmap -clstats <pid> ``` - **作用**:输出类加载器的元数据,包括加载的类数量和占用空间[^3]。 --- #### **注意事项** 1. **权限要求**:需与目标JVM进程用户一致,或具备`sudo`权限。 2. **生产环境慎用**:`-dump:live`和`-histo:live`会触发Full GC,可能导致服务暂停。 3. **替代工具**:JDK 8+推荐使用`jcmd`替代部分功能(如`jcmd <pid> GC.heap_dump`生成堆转储)。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值