Java内存分析工具——jmap
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服务在远程跑的时候,这个服务的唯一 IDremote-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相关推荐
- Java内存分析工具MAT(Memory Analyzer Tool)的介绍与使用
详细介绍了Java内存分析工具MAT(Memory Analyzer Tool)的常见使用方法,MAT可以帮助Java程序员快速进行内存分析,定位问题. MAT(Memory Analyzer Too ...
- java 内存分析之jmap 详细用法完整版(一)
文章目录 一.jmap下载内存信息命令 二.使用eclipse插件MAT来分析heap profile 前言:当我们遇到内存溢出,想要看详细的内存信息,可以使用java自带工具jmap下载完整的内存信 ...
- java内存分析工具_java内存查看与分析
业界有很多强大的java profile的工具,比如Jporfiler,yourkit,这些收费的东西我就不想说了,想说的是,其实java自己就提供了很多内存监控的小工具,下面列举的工具只是一小部分, ...
- IntelliJ IDEA——插件之java内存分析工具(JProfiler)
1.marketplace中搜索jprofiler 2.installed后需要去jprofiler官网安装jprofiler可执行客户端 官网地址:https://www.ej-technologi ...
- java内存分析工具
jmap 1.概念 JVM Memory Map命令用于生成heap dump文件,如果不使用这个命令,还可以使用-XX:+HeapDumpOnOutOfMemoryError参数来让虚拟机出现OOM ...
- java oql_深入理解java虚拟机(八):java内存分析工具-MAT和OQL
以下内容翻译自MAT帮助文档. 一.Class Histogram Class Histogram shows the classes found in the snapshot, the numbe ...
- mac 安装eclipse mat java内存分析工具
此版本为独立版,无需安装eclipse 1. 进入官网下载软件 https://www.eclipse.org/mat/ 如果下载较慢,可以切换镜像 2. 下载后解压,直接打开软件 提示报错 查看该日 ...
- 利用java虚拟机的工具jmap分析java内存情况
2019独角兽企业重金招聘Python工程师标准>>> 有时候碰到性能问题,比如一个java application出现out of memory,出现内存泄漏的情况,再去修改bug ...
- java jmap 分析_利用java虚拟机的工具jmap分析java内存情况
有时候碰到性能问题,比如一个java application出现out of memory,出现内存泄漏的情况,再去修改bug可能会变得异常复杂,利用工具去分析整个java application 内 ...
最新文章
- 计算机科学实验教学示范中心,校领导调研计算机科学与技术国家级实验教学示范中心...
- 2018/8/28-29 Some metaheuristics should be simplified
- Linux环境安装、卸载Docker
- 华为P30Pro国外采用4根天线设计,为何国内却只有2根?
- Acwing第 4 场周赛【未完结】
- z-index失效的情况
- android 界面跳转封装,【Android】Fragment跳转系列
- java569_java如何实现这样一个程序
- P3924 康娜的线段树
- C++ 虚函数表详解
- matlab正弦函数傅里叶变换,正弦函数及其傅里叶变换 二
- VB6.0调用WebService
- 跟着我从零开始入门FPGA(一周入门系列)第三天
- lucene【转载】
- 2019年3月WHQL认证最新申请流程
- 仿淘票票 —— 微信小程序
- Ubuntu安装sogo输入法
- 百度李彦宏致股东:选择技术战略,就必须抵御短期机会诱惑 | CEO说
- 一篇文章读懂JSON
- 使用PLSQL文本导入器导入文本数据
热门文章
- 结合原理图关于STM32后期例程的更新说明
- 7.联合索引(最左前缀原则)
- JavaWeb+MySql实现简易商城系统
- 试验箱开展维修保养时很容易忽略的地区
- 个体工商户属于小微企业吗_小型微利企业有优惠,个体工商户是否也要考虑呢?...
- 使用计算机有哪些违规操作,你在用的哪些APP含违法违规 没想到居然有它
- python教程72--Streamlit试用体会
- 黑龙江工业机器人夹爪_工业夹爪运用的意义
- ai怎么做风景插画?这篇文章告诉你
- iperf3怎么看结果_网速测试利器-iperf3