jmap [option] <pid>
关于 option 的选项,有下面这么几个
1,jmap -dump:[live,] format=b, file=filename pid
jmap -F -dump:format=b,file=tomcat.txt 113089
以hprof二进制格式转储Java堆到指定filename tomcat.txt 的文件中。live子选项是可选的。如果指定了live子选项,堆中只有活动的对象会被转储。想要浏览heap dump,你可以使用jhat(Java堆分析工具)读取生成的文件。
这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用, 线上系统慎用。
确实运行的比较久哟,等不了啦,ctrl + c 啦。一会儿功夫都100多兆了。既然线上慎用,那估计就是用不了啦。
2,jmap -finalizerinfo pid
打印正等候回收的对象的信息
jmap -finalizerinfo 757471
运行2次都是0,finalizer 这个单词是终结的意思
3,jmap -heap pid
jmap -heap 757471
打印heap的概要信息,GC使用的算法,heap(堆)的配置及JVM堆内存的使用情况.
jmap -heap 757471
下面是命令的输出情况:
Attaching to process ID 757471, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.131-b11
using parallel threads in the new generation.//在新一代中使用并行线程
using thread-local object allocation.//使用线程本地对象分配
Concurrent Mark-Sweep GC//cms gc
对比这简单的翻译看1看。1.8的jdk。
堆的设置里面出现的几个值的解释。
-XX:MinHeapFreeRatio=percent
设置垃圾收集事件后允许的最小可用堆空间百分比(0到100)。如果可用堆空间低于此值,则将扩展堆。默认情况下,此值设置为40%
-XX:MaxHeapFreeRatio=percent
设置GC事件后允许的最大可用堆空间百分比(0到100)。如果空闲堆空间扩展到该值之上,则堆将收缩。默认情况下,此值设置为70%
-XX:MaxHeapSize=size
设置内存分配池的最大大小(在byes中)。这个值必须是1024的倍数并且大于2mb。附加字母k或k表示千字节,m或m表示兆字节,g或g表示千兆字节。默认值是在运行时根据系统配置选择的。对于服务器部署,
-XX:InitialHeapSize和-XX:MaxHeapSize通常设置为相同的值
-XX:NewSize=size
设置年轻代(托儿所)堆的初始大小(以字节为单位)。附加字母k或k表示千字节,m或m表示兆字节,g或g表示千兆字节
堆的年轻代区域用于新对象。与其他区域相比,在这个区域执行GC的频率更高。如果年轻代的大小太低,那么将执行大量的次要gc。
如果大小过大,则只执行完整的gc,这可能需要很长时间才能完成。
Oracle建议将年轻代的大小保持在总体堆大小的一半到四分之一之间。
-XX:MaxNewSize=size
设置年轻代(托儿所)堆的最大大小(以字节为单位)。默认值的设置符合人体工程学
OldSize
就字面意思吧
-XX:NewRatio=ratio
设置年轻一代和老一代人的比例。默认情况下,此选项设置为2。
-XX:SurvivorRatio=ratio
设置eden空间大小与幸存者空间大小之间的比率。默认情况下,此选项设置为8。
-XX:MetaspaceSize=size
设置分配的类元数据空间的大小,该空间在第一次超过时将触发垃圾收集。垃圾收集的此阈值将根据使用的元数据量增加或减少。默认大小取决于平台
CompressedClassSpaceSize
字面意思,压缩 类 空间 大小
-XX:MaxMetaspaceSize=size
设置可以为类元数据分配的最大本机内存量。默认情况下,大小不受限制。应用程序的元数据量取决于应用程序本身、其他正在运行的应用程序和系统上可用的内存量
-XX:G1HeapRegionSize=size
设置在使用垃圾优先(G1)收集器时细分Java堆的区域的大小。这个值可以在1mb到32mb之间。默认的区域大小是根据人体工程学的堆大小决定的,因为使用的是cms gc收集器不是G 1 收集器,所以这个没用。G 1收集器是把内存分成n 个大小的region。。。。
下面就是heap里面的年轻代的eden和2个s区一个from一个to
capacity 容量容积,used使用的 free未使用的
concurrent mark-sweep generation:的大小和上面的old size大小一样,说明是同一个地方。
interned String类有个intern()方法,是将字符串放到字符串常量池中。
这个意思也就差不多了。
再结合一下这个进程的启动各种参数看一看
4,jmap -histo:live 113089
打印堆的直方图。对于每个Java类,将打印对象数量、内存大小(以字节为单位)和完全限定的类名。JVM内部类名使用星号(*)前缀打印。如果指定了活动子选项,则只计算活动对象
-F 强迫.在pid没有相应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效.
jmap -histo:live 113089 > histo.txt
把结果输出到histo.txt文件中,方便查看。因为一下子输出太多,页面展示不下。
5,jmap -clstats pid
打印Java堆的类装入器wise统计信息。对于每个类装入器,都会打印它的名称、活动程度、地址、父类装入器以及它装入的类的数量和大小
jmap -clstats 961012
不了解类加载机制,这个看不懂。