Java内存分析工具——jmap

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

能干嘛?

jmap 一般可用于:

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

示例:

怎么用?

jmap 相关命令:

可通过 jmap --help 查看

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

1、jmap [option]

**jmap [option] **

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

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

2、jmap [option] <executable

jmap [option] <executable

  • 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 :显示出加载器静态对象

常用命令:

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)(新生代、老年代)

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

可以根据 ip:7000 来查看:

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

执行:

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

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

查看该文件内容:

常用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内存分析工具——jmap相关推荐

  1. Java内存分析工具MAT(Memory Analyzer Tool)的介绍与使用

    详细介绍了Java内存分析工具MAT(Memory Analyzer Tool)的常见使用方法,MAT可以帮助Java程序员快速进行内存分析,定位问题. MAT(Memory Analyzer Too ...

  2. java 内存分析之jmap 详细用法完整版(一)

    文章目录 一.jmap下载内存信息命令 二.使用eclipse插件MAT来分析heap profile 前言:当我们遇到内存溢出,想要看详细的内存信息,可以使用java自带工具jmap下载完整的内存信 ...

  3. java内存分析工具_java内存查看与分析

    业界有很多强大的java profile的工具,比如Jporfiler,yourkit,这些收费的东西我就不想说了,想说的是,其实java自己就提供了很多内存监控的小工具,下面列举的工具只是一小部分, ...

  4. IntelliJ IDEA——插件之java内存分析工具(JProfiler)

    1.marketplace中搜索jprofiler 2.installed后需要去jprofiler官网安装jprofiler可执行客户端 官网地址:https://www.ej-technologi ...

  5. java内存分析工具

    jmap 1.概念 JVM Memory Map命令用于生成heap dump文件,如果不使用这个命令,还可以使用-XX:+HeapDumpOnOutOfMemoryError参数来让虚拟机出现OOM ...

  6. java oql_深入理解java虚拟机(八):java内存分析工具-MAT和OQL

    以下内容翻译自MAT帮助文档. 一.Class Histogram Class Histogram shows the classes found in the snapshot, the numbe ...

  7. mac 安装eclipse mat java内存分析工具

    此版本为独立版,无需安装eclipse 1. 进入官网下载软件 https://www.eclipse.org/mat/ 如果下载较慢,可以切换镜像 2. 下载后解压,直接打开软件 提示报错 查看该日 ...

  8. 利用java虚拟机的工具jmap分析java内存情况

    2019独角兽企业重金招聘Python工程师标准>>> 有时候碰到性能问题,比如一个java application出现out of memory,出现内存泄漏的情况,再去修改bug ...

  9. java jmap 分析_利用java虚拟机的工具jmap分析java内存情况

    有时候碰到性能问题,比如一个java application出现out of memory,出现内存泄漏的情况,再去修改bug可能会变得异常复杂,利用工具去分析整个java application 内 ...

最新文章

  1. 计算机科学实验教学示范中心,校领导调研计算机科学与技术国家级实验教学示范中心...
  2. 2018/8/28-29 Some metaheuristics should be simplified
  3. Linux环境安装、卸载Docker
  4. 华为P30Pro国外采用4根天线设计,为何国内却只有2根?
  5. Acwing第 4 场周赛【未完结】
  6. z-index失效的情况
  7. android 界面跳转封装,【Android】Fragment跳转系列
  8. java569_java如何实现这样一个程序
  9. P3924 康娜的线段树
  10. C++ 虚函数表详解
  11. matlab正弦函数傅里叶变换,正弦函数及其傅里叶变换 二
  12. VB6.0调用WebService
  13. 跟着我从零开始入门FPGA(一周入门系列)第三天
  14. lucene【转载】
  15. 2019年3月WHQL认证最新申请流程
  16. 仿淘票票 —— 微信小程序
  17. Ubuntu安装sogo输入法
  18. 百度李彦宏致股东:选择技术战略,就必须抵御短期机会诱惑 | CEO说
  19. 一篇文章读懂JSON
  20. 使用PLSQL文本导入器导入文本数据

热门文章

  1. 结合原理图关于STM32后期例程的更新说明
  2. 7.联合索引(最左前缀原则)
  3. JavaWeb+MySql实现简易商城系统
  4. 试验箱开展维修保养时很容易忽略的地区
  5. 个体工商户属于小微企业吗_小型微利企业有优惠,个体工商户是否也要考虑呢?...
  6. 使用计算机有哪些违规操作,你在用的哪些APP含违法违规 没想到居然有它
  7. python教程72--Streamlit试用体会
  8. 黑龙江工业机器人夹爪_工业夹爪运用的意义
  9. ai怎么做风景插画?这篇文章告诉你
  10. iperf3怎么看结果_网速测试利器-iperf3