Java内存分析工具——jmap

Java内存分析工具——jmap

平时我们在开发Java应用的时候,会涉及到分析对象内存、内存监控,那么就涉及到jmap这个工具,学习后来介绍一下

能干嘛?

jmap 一般可用于:

  • jmap能够打印给定Java进程、核心文件或远程DEBUG服务器的共享对象内存映射或堆内存的详细信息
  • 内存监控
  • 分析对象内存

示例:

Java内存分析工具——jmap_第1张图片

怎么用?

jmap 相关命令:

可通过 jmap --help 查看

  • jmap [option] :连接运行的进程 ,分析内存情况
  • jmap [option]
  • jmap [option] [server_id@] :连接到远程的服务器进行分析
  • jmap -help / java -h : 查看帮助信息

1、jmap [option]

**jmap [option] **

  • pid: 可通过 jps 或者 ps 获得

示例如上面 示例图 一样,用ps 查询到java 的进程号 25488 ,然后 jmap 25488 查看到当前进程的相关信息

2、jmap [option]

jmap [option]

  • executable: 生成核心转储的Java可执行文件。
  • core: 要打印配置信息的核心文件

3、jmap [option] [server_id@]

  • server-id: 当很多debug服务在远程跑的时候,这个服务的唯一 ID
  • remote-hostname-or-IP: 远程服务的IP或者hostname

4、[option]

  • -dump: :生成Java堆快储快照,如下
    • live:仅将存活得对象dump出
    • format:编码格式
    • file :生成得文件名称
  • -finalizerinfo :显示出等待执行 finalize方法得对象
  • -heap : 显示Java堆详细信息
  • -histo[:live] :显示堆中对象的详细信息,如果加了live,只显示 存活 得对象信息
  • -clstats :显示出加载器静态对象

Java内存分析工具——jmap_第2张图片

常用命令:

jmap [pid] # 查看具体情况

jmap -dump:live,format=b,file=xxx.xxx [pid] #将当前Java进程的内存占用情况导出来
 
jmap -histo:live [pid] >a.log  # 显示 存活 得对象信息

jmap -finalizerinfo [pid] # 查看 等待执行finalize 方法的数量

jmap -heap [pid] # 堆摘要信息

示例:(这里有一个Java 应用,pid为 25488)

1、jmap -heap [pid] : 显示堆的详细信息

执行:

jmap -head 25488

执行情况,显示二个主要的信息

  • 堆的配置(Heap Configuration)
  • 堆使用(Heap Usage)(新生代、老年代)

Java内存分析工具——jmap_第3张图片

2、jmap -finalizerinfo [pid] : 查看 等待执行finalize 方法的数量

执行:

jmap -finalizerinfo 25488

执行情况,显示待执行 finalize 方法的对象数量

请添加图片描述

3、jmap -dump:live,format=b,file=xxx.xxx [pid] #将当前Java进程的内存占用情况导出来

执行:

jmap -dump:live,format=b,file=/home/lms/a.txt 25488

执行情况,在指定路径下生成指定快照文件 a.txt,生成的文件可以用 jhat 工具来进行分析

请添加图片描述

生成的文件用jhat来分析, 默认开启端口7000

Java内存分析工具——jmap_第4张图片

可以根据 ip:7000 来查看:

Java内存分析工具——jmap_第5张图片

4、jmap -histo:live [pid] >a.log #将当前Java进程的内存占用情况导出来

执行:

jmap -histo:live 25488 >/home/lms/a.log

执行情况,在指定路径下生成指定导出文件a.log

请添加图片描述

查看该文件内容:

Java内存分析工具——jmap_第6张图片

常用JVM参数:

-Xms:初始堆大小,默认为物理内存的1/64(<1GB);默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制
-Xmx:最大堆大小,默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制
-Xmn:新生代的内存空间大小,注意:此处的大小是(eden+ 2 survivor space)。与jmap -heap中显示的New gen是不同的。整个堆大小=新生代大小 + 老生代大小 + 永久代大小。在保证堆大小不变的情况下,增大新生代后,将会减小老生代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
-XX:SurvivorRatio:新生代中Eden区域与Survivor区域的容量比值,默认值为8。两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10。
-Xss:每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。应根据应用的线程所需内存大小进行适当调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。一般小的应用, 如果栈不是很深, 应该是128k够用的,大的应用建议使用256k。这个选项对性能影响比较大,需要严格的测试。和threadstacksize选项解释很类似,官方文档似乎没有解释,在论坛中有这样一句话:"-Xss is translated in a VM flag named ThreadStackSize”一般设置这个值就可以了。
-XX:PermSize:设置永久代(perm gen)初始值。默认值为物理内存的1/64。
-XX:MaxPermSize:设置持久代最大值。物理内存的1/4。

相关链接

1、若使用报错,请查看 另外一篇博客

Error attaching to process sun.jvm.hotspot.debugger.DebuggerException cannot open binary file

2、官方文档

Jmap官方文档

3、jinfo

Java分析工具——jinfo

你可能感兴趣的:(运维相关,JAVA,java,jvm,jmap)