java学习-jmap命令

上篇学习笔记用mat分析dump,就是用jmap命令生成的。所以借这个机会整理下jmap常用命令
背景:j ava dump是Java虚拟机的运行时快照。将Java虚拟机运行时的状态和信息保存到文件。
线程Dump,包含所有线程的运行状态。纯文本格式。
堆Dump,包含线程Dump,幵包含所有堆对象的状态。二进制格式。
jmap 的用途是为了展示java进程的内存映射信息,或者堆内存详情。

常用的参数如下:

-histo

测试了下,报错:

jmap histo 8423

Attaching to core 8423 from executable histo, please wait...

Error attaching to core file: Can't attach to the core file

为啥呢?自己还想为啥呢?难道记错命令了:原来是少加了-,手一哆嗦就犯错了。

打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量. 

java学习-jmap命令_第1张图片

 

-finalizerinfo 打印正等候回收的对象的信息


-heap

jmap -heap pid 展示pid的整体堆信息  GC使用的算法
java学习-jmap命令_第2张图片

下面是参数说明:
  
Heap Configuration:#堆内存初始化配置  
   MinHeapFreeRatio = 0 #-XX:MinHeapFreeRatio设置JVM堆最小空闲比率  
   MaxHeapFreeRatio = 100  #-XX:MaxHeapFreeRatio设置JVM堆最大空闲比率  
   MaxHeapSize      =  (8000.0MB)#-XX:MaxHeapSize=设置JVM堆的最大大小  
   NewSize          = (1.25MB) #-XX:NewSize=设置JVM堆的‘新生代’的默认大小  
   MaxNewSize       = 17592186044415 MB  #-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小  
   OldSize          = 5439488 (5.1875MB) #-XX:OldSize=设置JVM堆的‘老生代’的大小  
   NewRatio         = 2 #-XX:NewRatio=:‘新生代’和‘老生代’的大小比率  
   SurvivorRatio    = 8 #-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值  
   PermSize         = 21757952 (20.75MB) #-XX:PermSize=<value>:设置JVM堆的‘永生代’的初始大小  
   MaxPermSize      = 88080384 (84.0MB) #-XX:MaxPermSize=<value>:设置JVM堆的‘永生代’的最大大小    
Heap Usage:  
PS Young Generation  
Eden Space:#Eden区内存分布  
   capacity = (300MB)  容量
   used     = (252MB) 已使用
   free     = (47MB) 空闲 
  使用率% used  
From Space:#其中一个Survivor区的内存分布  
   capacity = 13828096 (13.1875MB)  
   used     = 196608 (0.1875MB)  
   free     = 13631488 (13.0MB)  
   1.4218009478672986% used  
To Space:#另一个Survivor区的内存分布  
   capacity = 16384000 (15.625MB)  
   used     = 0 (0.0MB)  
   free     = 16384000 (15.625MB)  
   0.0% used  
PS Old Generation#当前的Old区内存分布  
   capacity = 156172288 (148.9375MB)  
   used     = 27098208 (25.842864990234375MB)  
   free     = 129074080 (123.09463500976562MB)  
   17.35148299805917% used  
PS Perm Generation#当前的 “永生代” 内存分布  
   capacity = 88080384 (84.0MB)  
   used     = 50847592 (48.492042541503906MB)  
   free     = 37232792 (35.507957458496094MB)  
   57.728622073218936% used
 
 -permstat 
打印classload和jvm heap长久层的信息. 包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来.
 
-dump
将内存使用的详细情况输出到文件,执行命令: jmap -dump:format=b,file=heapDump 6900
导出的dump文件可以使用mat分析。见上一篇学习笔记。
*********************************************************
总结:
1.如果程序内存不足或者频繁GC,很有可能存在内存泄露情况,这时候就要借助Java堆Dump查看对象的情况。
2. 使用  jmap -histo:[live]  查看堆内存中的对象的情况。如果有大量对象在持续被引用,并没有被释放掉,那就产生了内存泄露,就要结合代码,把不用的对象释放掉。
3.针对内存泄漏,可以dump多次内存。可以使用mat进行对比,查找差异,便于查找问题。

参照文章: http://www.importnew.com/18176.html

你可能感兴趣的:(java学习-jmap命令)