代码编织梦想

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42272869/article/details/124190855

java jinfo 命令详解_yx0628的博客-爱代码爱编程_jinfo 命令

jinfo 命令可以用来查看 Java 进程运行的 JVM 参数,命令如下: [root@admin ~]# jinfo --help Usage: jinfo [option] <pid>

常用jvm参数-爱代码爱编程

常用JVM参数 -Xms:初始堆大小,默认为物理内存的1/64(<1GB);默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制 -Xmx:最大堆大小,默认

jvm系列:jinfo命令详解_weixin_33815613的博客-爱代码爱编程

2019独角兽企业重金招聘Python工程师标准>>>      jinfo全称Java Configuration Info,主要作用是实时查看和调整JVM配置参数。 一.查看JVM参数     用法:jinfo -flag <name> PID     示例:    

深入浅出jvm调优,看完你就懂_lemon-的博客-爱代码爱编程_jvm调优

    深入浅出JVM调优 基本概念: JVM把内存区分为堆区(heap)、栈区(stack)和方法区(method)。由于本文主要讲解JVM调优,因此我们可以简单的理解为,JVM中的堆区中存放的是实际的对象,是需要被GC的。其他的都无需GC。 下图文JVM的内存模型   从图中我们可以看到, 1、JVM实质上分为三大块,年轻代(You

jinfo命令使用详解-爱代码爱编程

jinfo命令  该命令可以打印出java进程的配置信息:包括jvm参数,系统属性等用法: jinfo [ option ] pid jinfo [ option ] executable core jinfo [ option ] [server-id@]remote-hostname-or-IP参数:  pid   进程号 executable  

【JVM】调优步骤及相关命令-爱代码爱编程

JVM调优基本步骤   -------------------------------------------------------华丽的分割线---------------------------------------------------- 常用分析工具: 1、jconsole 2、jvisualvm 3、arthas 

JVM基础和调优-爱代码爱编程

身边有同学实习面试被问,JVM性能调优等问题,来总结一下JVM 什么是JVM JDK1.8已经不存在方法区,增加了元空间; JAVA对象的组成 如对象组成中的分代年龄(4bit),跟GC的分代相关; JVM如何执行.java文件以及运行期数据区 基础的概念不写了,文章后面补上; 什么是程序计数器,作用? 什么是 J

jinfo使用-爱代码爱编程

jinfo 顾名思义 就是java进程信息 参数查看和修改  jinfo   进程号 如项目很多信息  ,Java代码可以通过System.getProperties()获取。 C:\Users\Administrator>jinfo 10448 Attaching to process ID 10448, please wait... D

jvm 性能调优工具之 jinfo命令详解-爱代码爱编程

一、jinfo 1、简介         jinfo(Configuration Info for Java) 查看虚拟机配置参数信思,也可用于调整虚拟机的配置参数。         在很多情况下,Java应用程序不会指定所有的Java虚拟机参数。而此时,开发人员可能不知道某一个具体的Java虚拟机参数的默认值。在这种情况下,可能需要通过查找

JVM常见命令之jinfo-爱代码爱编程

1、jinfo -help 帮助文档 参数说明 pid 对应jvm的进程idexecutable core 产生core dump文件[server-id@]remote server IP or hostname 远程的ip或者hostname,server-id标记服务的唯一性idoption no option 输出全部的参数和系统属性-f