java jmap jh,Java内存分析工具 jmap

使用 jmap 分析JVM内存状态

前言

heap

查看整个JVM内存状态

打印 heap 的概要信息,GC使用的算法,heap 的配置和使用情况,可以用此来判断内存目前的使用情况以及垃圾回收情况。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48> jmap -heap 1234

Attaching to process ID 13497, please wait...

Debugger attached successfully.

Server compiler detected.

JVM version is 25.201-b09

using thread-local object allocation.

Parallel GC with 2 thread(s)

Heap Configuration:

MinHeapFreeRatio = 0

MaxHeapFreeRatio = 100

MaxHeapSize = 1048576000 (1000.0MB)

NewSize = 87031808 (83.0MB)

MaxNewSize = 349175808 (333.0MB)

OldSize = 175112192 (167.0MB)

NewRatio = 2

SurvivorRatio = 8

MetaspaceSize = 21807104 (20.796875MB)

CompressedClassSpaceSize = 1073741824 (1024.0MB)

MaxMetaspaceSize = 17592186044415 MB

G1HeapRegionSize = 0 (0.0MB)

Heap Usage:

PS Young Generation

Eden Space:

capacity = 35127296 (33.5MB)

used = 31401816 (29.947105407714844MB)

free = 3725480 (3.5528945922851562MB)

89.39434450064132% used

From Space:

capacity = 524288 (0.5MB)

used = 131072 (0.125MB)

free = 393216 (0.375MB)

25.0% used

To Space:

capacity = 524288 (0.5MB)

used = 0 (0.0MB)

free = 524288 (0.5MB)

0.0% used

PS Old Generation

capacity = 92798976 (88.5MB)

used = 11140584 (10.624488830566406MB)

free = 81658392 (77.8755111694336MB)

12.005072124933791% used

12155 interned Strings occupying 1063376 bytes.

histo

查看JVM堆中对象详细占用情况

打印堆的对象统计,包括对象数、内存大小等。jmap -histo:live 这个命令执行,JVM会先触发gc,然后再统计信息。

列对应信息为编号id、实例个数、所有实例大小、类名

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21> jmap -histo 783

num #instances #bytes class name

----------------------------------------------

1: 286511 9516456 [Ljava.lang.Object;

2: 113692 9458248 [C

3: 31510 6249248 [B

4: 132529 4240928 java.io.ObjectStreamClass$WeakClassKey

5: 95868 3834720 java.util.TreeMap$Entry

6: 14097 3740048 [I

7: 60312 1447488 java.lang.String

8: 25273 1213104 java.util.HashMap

9: 46425 1114200 java.lang.Long

10: 10056 1045824 java.io.ObjectStreamClass

11: 10429 500592 java.util.TreeMap

12: 7332 470824 [Ljava.util.Hashtable$Entry;

13: 14637 468384 java.util.Vector

14: 4609 442464 java.lang.management.ThreadInfo

15: 12704 406528 java.util.TreeMap$KeyIterator

16: 15719 377256 java.io.SerialCallbackContext

17: 7325 351600 java.util.Hashtable

dump

dump堆到文件,format指定输出格式,live指明是活着的对象,file指定文件名

1> jmap -dump:live,format=b,file=/lihm.hprof 129665

这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用, 线上系统慎用。

lihm.hprof 为二进制文件,less 命令查看不了,得用分析工具分析,比如jhat、MAT

jhat 查看

1

2

3

4

5

6

7

8

9

10> jhat -J-Xmx1024M lihm.hprof

Reading from lihm.txt...

Dump file created Thu Oct 24 16:26:47 CST 2019

Snapshot read, resolving...

Resolving 104381 objects...

Chasing references, expect 20 dots....................

Eliminating duplicate references....................

Snapshot resolved.

Started HTTP server on port 7000

Server is ready.

访问7000端口, 可以统计实例总数、占用大小

bd7bdb9f6129cae65be3db12ba00c098.png

27bd243054ab81b53cf368141b139acb.png

MAT工具的下载和安装

MAT(Memory Analyzer Tool)工具是eclipse的一个插件(MAT也可以单独使用),使用起来非常方便,尤其是在分析大内存的dump文件时,可以非常直观的看到各个对象在堆空间中所占用的内存大小、类实例数量、对象引用关系、利用OQL对象查询,以及可以很方便的找出对象GC Roots的相关信息,当然最吸引人的还是能够快速为开发人员生成内存泄露报表,方便定位问题和分析问题。

-F

强制模式。如果指定的pid没有响应,请使用jmap -dump或jmap -histo选项。此模式下,不支持live子选项。

参考链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值