上文:JVM-jinfo的使用
jmap:Java内存映像工具是什么?可以干什么?
jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为heapdump或dump文件)。
可以干什么?
java memory = direct memory(直接内存) + jvm memory(MaxPermSize +Xmx)
jmap的作用并不仅仅是为了获取堆转储快照,它还可以查询finalize执行队列、Java堆和方法区的详细信息,如空间使用率、当前用的是哪种收集器等。
实现
查看进程的内存映像信息
打印出共享对象映射打印目标虚拟机中加载的每个共享对象的起始地址、映射大小以及共享对象文件的路径全称。
jmap 20220
对应 起始地址、映射大小、共享对象文件的路劲全称
查看Finalizer队列
打印等待终结的对象信息
jmap -finalizerinfo 20220
注意:这种只在Linux系统上面生效,在windows上面该命令查不出什么来。
Number of objects pending for finalization: 0 证明当前等待队列为0
显示 Java 堆详细信息
注意:该查询会导致
jmap -heap 20220
MinHeapFreeRatio | -XX:MinHeapFreeRatio设置JVM堆最小空闲比率 |
MaxHeapFreeRatio | -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率 |
MaxHeapSize | 最大堆内存3972MB |
NewSize | 新生代默认大小 83MB |
MaxNewSize | 新生代最大大小为 1324MB |
OldSize | 老年代大小 167MB |
NewRatio | 新生代和老年代的大小比率 2 |
SurvivorRatio | 年轻代中Eden和Survivor的比率 8 |
MetaspaceSize | 元空间大小 20.796875MB |
CompressedClassSpaceSize | 如果开启了-XX:+UseCompressedOops及-XX:+UseCompressedClassesPointers(默认是开启),则UseCompressedOops会使用32-bit的offset来代表java object的引用,而UseCompressedClassPointers则使用32-bit的offset来代表64-bit进程中的class pointer;可以使用CompressedClassSpaceSize来设置这块的空间大小 |
MaxMetaspaceSize | 最大元空间大小 1073741824 |
G1HeapRegionSize | G1收集器启用,一个Region的大小可以通过参数-XX:G1HeapRegionSize设定,取值范围从1M到32M,且是2的指数。 |
显示class的内存情况
jmap -histo 20220
instances:实例数;
bytes:内存占用大小;
classs name:类名。
从大到小排序
jmap -histo:live 20220
生成文件
jmap -histo:live 20220>D://hong.log
打印类加载信息
jmap -clstats 20220
打印Java堆内存的永久保存区域的类加载器的智能统计信息。对于每个类加载器而言,它的名称、活跃度、地址、父类加载器、它所加载的类的数量和大小都会被打印。此外,包含的字符串数量和大小也会被打印。
生成堆转储快照文件
注意:会暂停应用
jmap -dump:live,format=b,file=D://hong2.log 20220
参数:
option:选项参数,不可同时使用多个选项参数
pid:java进程id,命令ps -ef | grep java获取
executable:产生核心dump的java可执行文件
core:需要打印配置信息的核心文件
remote-hostname-or-ip:远程调试的主机名或ip
server-id:可选的唯一id,如果相同的远程主机上运行了多台调试服务器,用此选项参数标识服务器
打开D盘中的文件。(这个文件在jhat中可以被分析)
参考:
https://blog.csdn.net/weixin_37335761/article/details/110506369
https://docs.oracle.com/javase/7/docs/technotes/tools/share/jmap.html
https://docs.oracle.com/javase/9/tools/jmap.htm#JSWOR746
往期推荐