java查看堆内对象_jmap 查看堆内对象占用空间大小详情

jmap是JDK自带的一个工具,非常小巧方便,其支持参数如下: -heap

打印heap空间的概要,这里可以粗略的检验heap空间的使用情况。

jmap -heap PID 查看堆配置参数及当前占用情况

fs@inspur92:~/test/llxdata/081005/tmp$ jmap -heap 30774

Attaching to process ID 30774, please wait...

Debugger attached successfully.

Server compiler detected.

JVM version is 20.1-b02

using thread-local object allocation.

Parallel GC with 8 thread(s)

Heap Configuration:

MinHeapFreeRatio = 40

MaxHeapFreeRatio = 70

MaxHeapSize = 1073741824 (1024.0MB)

NewSize = 1310720 (1.25MB)

MaxNewSize = 17592186044415 MB

OldSize = 5439488 (5.1875MB)

NewRatio = 2

SurvivorRatio = 8

PermSize = 21757952 (20.75MB)

MaxPermSize = 268435456 (256.0MB)

Heap Usage:

PS Young Generation

Eden Space:

capacity = 353107968 (336.75MB)

used = 9083624 (8.662818908691406MB)

free = 344024344 (328.0871810913086MB)

2.572477775409475% used

From Space:

capacity = 2359296 (2.25MB)

used = 0 (0.0MB)

free = 2359296 (2.25MB)

0.0% used

To Space:

capacity = 2359296 (2.25MB)

used = 0 (0.0MB)

free = 2359296 (2.25MB)

0.0% used

PS Old Generation

capacity = 715849728 (682.6875MB)

used = 47522208 (45.320709228515625MB)

free = 668327520 (637.3667907714844MB)

6.638573172720407% used

PS Perm Generation

capacity = 40435712 (38.5625MB)

used = 40067528 (38.21137237548828MB)

free = 368184 (0.35112762451171875MB)

99.08945834810575% used

以上的输出很简单,第四行起开始输出此进程的JAVA使用的环境。 Heap Configuration:指java应用启动时设置的JVM参数。像最大使用内存大小,年老代,年青代,持久代大小等。

Heap Usage:当时的heap实际使用情况。包括新生代、老生代和持久代。

其中新生代包括:Eden区的大小、已使用大小、空闲大小及使用率。Survive区的From和To同样。

有这个可以很简单的查看本进程的内存使用情况。

可以用于分析堆内存分区大小是否合理,新生代和老生代的大小分配是否合适等。

也许进程占用的总内存比较多,但我们在这里可以看到真正用到的并没有多少,很多都是"Free"。内存使用的堆积大多在老年代,内存池露始于此,所以要格外关心“Old Generation”。

jmap -histo PID 查看对内对象占用空间大小,有高到低排序

这里会生成一个类的统计报表,此表非常简单,如显示什么类有多少个实例,共占了多少字节等。如下:

fs@inspur92:~/test/llxdata/081005/tmp$ jmap -histo 30774

num #instances #bytes class name

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

1: 12077 37306240 [I

2: 8404 8913528 [B

3: 55627 8311744

4: 55627 7576152

5: 35982 6771360 [C

6: 4838 5536240

7: 88849 4696992

8: 4838 3735856

9: 4024 3334976

10: 4600 2201648

11: 35011 1120352 java.lang.String

12: 5286 549744 java.lang.Class

13: 6509 441272 [S

14: 7454 392128 [[I

其中关于I、B、C等的说明如下 Table 4.2.

BaseType CharacterTypeInterpretation

Bbytesigned byte

CcharUnicode character

Ddoubledouble-precision floating-point value

Ffloatsingle-precision floating-point value

Iintinteger

Jlonglong integer

L;referencean instance of class de>de>

Sshortsigned short

Zbooleande>truede> or de>falsede>

[referenceone array dimension

jmap -permstat 查看永久代

打印一些持久代上的内存使用状态,有“活”的,有“死”的。

class_loader classes bytes parent_loader alive? type

2099 12780072 null live

0x00000000c069dc58 1 1968 0x00000000c017e968 dead sun/reflect/DelegatingClassLoader@0x00000000b00685b0

0x00000000c05c37d8 1 2008 0x00000000c017e968 dead sun/reflect/DelegatingClassLoader@0x00000000b00685b0

0x00000000c069d900 1 1968 0x00000000c017e968 dead sun/reflect/DelegatingClassLoader@0x00000000b00685b0

不常用。

-heap:format=b

产生一个HeapDump文件,此为生成heapdump文件的重要参数。 例:

jmap -heap:format=b 2657

会产生一个heap.bin的heapdump文件。 需要注意的是,此生成heapdump的参数为JDK1.5,在1.6中的格式为: jmap -dump:live,format=b,file=xxx 2657 这里更加强大一些,可以指定是存活的对象,还有生成heapdump的文件名。

当被测应用使用内容较大时(4G以上),dump需要花费较长时间,很可能导致dump失败。

dump下来的文件结合jhat进行分析会更方便。 jhat jhat是一个Java堆复制浏览器。这个工具分析Java堆复制文件(例如,由上面的"jmap -dump"所产生的)。Jhat启动一个允许堆中的对象在web浏览器中进行分析的web服务器。这个工具并不是想用于应用系统中而是用于"离线"分析。"jhat工具是平台独立的",其意思是,它可以被用来观察在任何平台上所产生的堆复制。例如,我们有可能在Linux系统上使用jhat来观察一个 在Solaris OS上所产生的堆复制。 把本机的java内存映像导出到heap.dmp中,其中PID为java进程的ID号。 jmap -dump:live,format=b,file=heap.dmp PID

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值