jmap,jhat分析内存

分析JAVA Application的内存使用时,jmap是一个很实用的轻量级工具。使用jmap可以查看heap空间的概要情况,粗略的掌握heap的使用情况。也可以生成heapdump文件,再使用jhat通过web浏览器具体分析内容中的对象和数据。



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

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

jmap -heap PID


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

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

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

[email protected]:~/test/llxdata/081005/tmp$ jmap -histo 30774

num     #instances         #bytes  class name ----------------------------------------------    1:         12077       37306240     [I    2:          8404        8913528       [B    3:         55627        8311744      <constMethodKlass>    4:         55627        7576152      <methodKlass>    5:         35982        6771360     [C    6:          4838        5536240     <constantPoolKlass>    7:         88849        4696992    <symbolKlass>    8:          4838        3735856    <instanceKlassKlass>    9:          4024        3334976    <constantPoolCacheKlass>   10:          4600        2201648    <methodDataKlass>   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 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<classname>; reference an instance of class de><classname>de>
S short signed short
Z boolean de>truede> or de>falsede>
[ reference one array dimension


jmap -permstat

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

class_loader    classes bytes   parent_loader   alive?  type <bootstrap>     2099    12780072          null          live    <internal> 0x00000000c069dc58      1       1968    0x00000000c017e968      dead    sun/reflect/[email protected] 0x00000000c05c37d8      1       2008    0x00000000c017e968      dead    sun/reflect/[email protected] 0x00000000c069d900      1       1968    0x00000000c017e968      dead    sun/reflect/[email protected]

不常用。



-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
导出后的映像文件可以用jhat来进行分析,-J是向java虚拟机传一个参数,如-mx768m是指定虚拟机可用最大的内存为768M。如果映像文件很大,你要指定一个很大的值,否则在分析过程中就会有OutOfMemeryError的错误。

jhat -J-mx768m -port <端口号:默认为7000> heap.dmp

时间: 2024-10-24 05:22:56

jmap,jhat分析内存的相关文章

JVM调优工具的使用(jps,jstat,jstack,jmap,jhat)

JDK本身提供了很丰富的性能监控工具,除了集成式的visualVM和jConsole外,还有jstat,jstack,jps,jmap,jhat小工具,这些都是性能调优的常用工具 我们在Java的开发中,常常会遇到下面这些问题: 1内存不足,2内存泄漏,3锁争用,4线程锁死,5java进程消耗CPU过高等 这些问题出现的时候 大家常常通过重启服务器或者调大内存来临时解决 一,jps命令 jps主要用来输出JVM中运行的进程状态信息 命令行参数选项: -q 不输出类名.Jar名和传入main方法的

jstat的使用/jam的使用/使用MAT分析内存溢出/

2.通过jmap监控内存使用情况 2.1 监控堆内存   jamp -heap 12840 2.2 监控内存中对象的数量及其大小 查看所有对象的数量以及大小包括类型:jmap -histo 14116 | more 查看所有对象的数量以及大小包括类型:jmap -histo:live 14116 | more 2.3 通过jmap导出堆内存使用情况的文件 2.4  通过jhat查看dump文件并且进行分析,启动一个HTTP端口进行访问,通过该端口可以查看到整个应用程序所使用的的所有对象的情况,提

Java程序内存分析:使用mat工具分析内存占用

在工作中可能会遇到内存溢出这种灾难性的问题,那么程序肯定是存在问题,找出问题至关重要,上一篇文章讲了jmap命令的使用方法,当然用jmap导出的文件我们也看不懂啊,那就交给memory analyzer(mat)这个工具,让他帮助我们来观察程序的内存分布情况吧. 1. 用jmap生成堆信息 2. 将堆信息导入到mat中分析 3. 生成分析报告 Histogram Dominator Tree Top consumers Leak Suspects MAT 不是一个万能工具,它并不能处理所有类型的

使用Android Studio分析内存问题

大家好!本人是即将毕业学生一枚,闲暇时间经常看大神们写的博客学到很多东西.最近在做毕业设计的时候遇到一些问题,然后把自己的问题和解决方法总结一下,有不对的地方希望大家多多包涵,提出批评与指导. 这篇博文主要介绍使用AndroidStudio对内存进行分析和跟踪,还有就是从源码角度解决ImageLoader引起的OOM问题. 我正在做的项目使用到了ImageLoader来加载图片,我也是第一次使用,就拿来直接用了.写完的代码运行很正常的加载图片,并没有发现什么问题.但是在测试的时候发现了问题.当多

Android最佳性能实践(二)——分析内存的使用情况

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/42238633 虽说现在的手机内存都已经非常大了,但是我们大家都知道,系统是不可能将所有的内存都分配给我们的应用程序的.没错,每个程序都会有可使用的内存上限,这被称为堆大小(Heap Size).不同的手机,堆大小也不尽相同,随着现在硬件设备不断提高,堆大小也已经由Nexus One时的32MB,变成了Nexus 5时的192MB.如果大家想要知道自己手机的堆大小是多少,可以调用如

Android Studio和MAT结合使用来分析内存问题

Android开发中时常会遇到内存泄漏的问题,而Android系统对单个App又有一定的内存限制,此值可以通过一下方式获取: ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); int memoryClass = am.getMemoryClass(); 上述代码中momeryClass的值可以当做每个App的内存限制.这个值根据不同的设备厂商都是不一样的,比如我的模拟器的值是32M,

linux内存源码分析 - 内存压缩(同步关系)

本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 概述 最近在看内存回收,内存回收在进行同步的一些情况非常复杂,然后就想,不会内存压缩的页面迁移过程中的同步关系也那么复杂吧,带着好奇心就把页面迁移的源码都大致看了一遍,还好,不复杂,也容易理解,这里我们就说说在页面迁移过程中是如何进行同步的.不过首先可能没看过的朋友需要先看看linux内存源码分析 - 内存压缩(一),因为会涉及里面的一些知识. 其实一句话可以概括页面迁移时是如何进行同步的,就是:我要开始对这

Atitit.提升稳定性-----分析内存泄漏PermGen OOM跟解决之道...java

Atitit.提升稳定性-----分析内存泄漏PermGen OOM跟解决之道...java 1. 内存区域的划分 1 2. PermGen内存溢出深入分析 1 3. PermGen OOM原因总结 2 4. 常见的类加载器和类型卸载的可能性总结 2 5. PermGen内存溢出的应对措施 3 6. 第二种就是使用oracle的BEA JDK,因为这个里面的JVM没有PermGen space 3 7. 参考 3 1. 内存区域的划分 java的内存泄漏基本上按照内存区域的划分可以分为: 1 堆

Linux内核源代码情景分析-内存管理之slab-回收

在上一篇文章Linux内核源代码情景分析-内存管理之slab-分配与释放,最后形成了如下图的结构: 图 1 我们看到空闲slab块占用的若干页面,不会自己释放:我们是通过kmem_cache_reap和kmem_cache_shrink来回收的.他们的区别是: 1.我们先看kmem_cache_shrink,代码如下: int kmem_cache_shrink(kmem_cache_t *cachep) { if (!cachep || in_interrupt() || !is_chaine