概述

jmap命令有下面几种常用的用法:

•jmap [pid]

•jmap -histo:live [pid] >a.log

•jmap -dump:live,format=b,file=xxx.xxx [pid]

用得最多是后面两个。其中,jmap -histo:live [pid] 可以查看当前Java进程创建的活跃对象数目和占用内存大小。

jmap -dump:live,format=b,file=xxx.xxx [pid] 则可以将当前Java进程的内存占用情况导出来,方便用专门的内存分析工具(例如:MAT)来分析。


jmap -heap <pid>输出

[tomcat@n01 ~]$ /opt/java/jdk1.8.0_101/bin/jmap -heap 11368
Attaching to process ID 11368, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.101-b13using thread-local object allocation.
Parallel GC with 2 thread(s)Heap Configuration:MinHeapFreeRatio         = 0MaxHeapFreeRatio         = 100MaxHeapSize              = 2684354560 (2560.0MB)NewSize                  = 1073741824 (1024.0MB)MaxNewSize               = 1073741824 (1024.0MB)OldSize                  = 1610612736 (1536.0MB)NewRatio                 = 2SurvivorRatio            = 8MetaspaceSize            = 21807104 (20.796875MB)CompressedClassSpaceSize = 1073741824 (1024.0MB)MaxMetaspaceSize         = 17592186044415 MBG1HeapRegionSize         = 0 (0.0MB)Heap Usage:
PS Young Generation
Eden Space:capacity = 852492288 (813.0MB)used     = 420427144 (400.95056915283203MB)free     = 432065144 (412.04943084716797MB)49.31741317993014% used
From Space:capacity = 113770496 (108.5MB)used     = 2299712 (2.19317626953125MB)free     = 111470784 (106.30682373046875MB)2.021360617079493% used
To Space:capacity = 107479040 (102.5MB)used     = 0 (0.0MB)free     = 107479040 (102.5MB)0.0% used
PS Old Generationcapacity = 1610612736 (1536.0MB)used     = 50883368 (48.526161193847656MB)free     = 1559729368 (1487.4738388061523MB)3.1592552860577903% used
interned Strings occupying 3138384 bytes.

MaxHeapFreeRatio: GC后如果发现空闲堆内存占到整个预估堆内存的N%(百分比),则收缩堆内存的预估最大值, 预估堆内存是堆大小动态调控的重要选项之一. 堆内存预估最大值一定小于或等于固定最大值(-Xmx指定的数值). 前者会根据使用情况动态调大或缩小, 以提高GC回收的效率
MinHeapFreeRatio: GC后如果发现空闲堆内存占到整个预估堆内存的N%(百分比), 则放大堆内存的预估最大值

MaxHeapSize: 即-Xmx, 堆内存大小的上限
InitialHeapSize: 即-Xms, 堆内存大小的初始值

NewSize: 新生代预估堆内存占用的默认值
MaxNewSize: 新生代占整个堆内存的最大值

OldSize: 老年代的默认大小, default size of the tenured generation
NewRatio: 老年代对比新生代的空间大小, 比如2代表老年代空间是新生代的两倍大小. The ratio of old generation to young generation.

SurvivorRatio: Eden/Survivor的值. 这个值的说明, 很多网上转载的都是错的. 8表示Survivor:Eden=1:8, 因为survivor区有2个, 所以Eden的占比为8/10. Ratio of eden/survivor space size. -XX:SurvivorRatio=6 sets the ratio between each survivor space and eden to be 1:6, each survivor space will be one eighth of the young generation.

xxxRatio一般以xxx作为分母,NewRatio是Old:New,SurvivorRatio是Eden:Survivor

Eden:Survivor = 8: 1

Old: New = 2:1

MetaspaceSize: 分配给类元数据空间的初始大小(Oracle逻辑存储上的初始高水位,the initial high-water-mark ). 此值为估计值. MetaspaceSize设置得过大会延长垃圾回收时间. 垃圾回收过后, 引起下一次垃圾回收的类元数据空间的大小可能会变大
MaxMetaspaceSize: 是分配给类元数据空间的最大值, 超过此值就会触发Full GC. 此值仅受限于系统内存的大小, JVM会动态地改变此值

CompressedClassSpaceSize: 类指针压缩空间大小, 默认为1G

G1HeapRegionSize: G1区块的大小, 取值为1M至32M. 其取值是要根据最小Heap大小划分出2048个区块. With G1 the Java heap is subdivided into uniformly sized regions. This sets the size of the individual sub-divisions. The default value of this parameter is determined ergonomically based upon heap size. The minimum value is 1Mb and the maximum value is 32Mb. Sets the size of a G1 region. The value will be a power of two and can range from 1MB to 32MB. The goal is to have around 2048 regions based on the minimum Java heap size.

指针压缩1. 64位平台上默认打开
  1)使用-XX:+UseCompressedOops压缩对象指针
    "oops"指的是普通对象指针("ordinary" object pointers)。
    Java堆中对象指针会被压缩成32位。
    使用堆基地址(如果堆在低26G内存中的话,基地址为0)
  2)使用-XX:+UseCompressedClassPointers选项来压缩类指针
    对象中指向类元数据的指针会被压缩成32位
    类指针压缩空间会有一个基地址

2. 元空间和类指针压缩空间的区别
  1)类指针压缩空间只包含类的元数据,比如InstanceKlass, ArrayKlass
    仅当打开了UseCompressedClassPointers选项才生效
    为了提高性能,Java中的虚方法表也存放到这里
    这里到底存放哪些元数据的类型,目前仍在减少
  2)元空间包含类的其它比较大的元数据,比如方法,字节码,常量池等。

使用  jmap -heap pid ,可以查看各个代的内存使用情况。

$ jmap -heap 2083

可以观察到New Generation(Eden Space,From Space,To Space),tenured generation,Perm Generation的内存使用情况

$ jmap -dump:format=b,file=heapdump.hprof <pid>

导出heap dump到文件heapdump.hprof

然后利用MAT工具分析是否存在内存泄漏等等

$ jmap -histo:live 2083 | head -n 100

可以观察heap中前100个占用内存最大的对象的情况(heap中所有生存的对象的情况)。包括对象数量和所占空间大小。

jmap -histo:live 2083 | head -n 100

[hadoop@DEV logs]$ jmap -histo 24527 | head -30num     #instances         #bytes  class name
----------------------------------------------1:         31939       98883072  [C2:          8594        9461992  [B3:         30326        4256232  <constMethodKlass>4:         30326        3892592  <methodKlass>5:          2719        3226344  <constantPoolKlass>6:          2450        1948704  <constantPoolCacheKlass>7:          2719        1869200  <instanceKlassKlass>8:         27599         662376  java.lang.String9:           836         442968  <methodDataKlass>10:          8215         394320  org.apache.tomcat.util.buf.ByteChunk11:          3012         366720  java.lang.Class12:         11257         360224  java.util.HashMap$Entry13:          3417         273360  java.lang.reflect.Method14:          6763         270520  java.util.TreeMap$Entry15:          4326         260720  [S16:          5410         259680  org.apache.tomcat.util.buf.MessageBytes17:          6410         256400  org.apache.tomcat.util.buf.CharChunk18:          4558         238352  [[I19:          3347         211512  [Ljava.lang.Object;20:          2144         189280  [I21:           276         147936  <objArrayKlassKlass>22:           948         142216  [Ljava.util.HashMap$Entry;23:          2874         137952  java.util.HashMap24:           621          89424  java.text.DecimalFormat25:          2555          81760  java.util.concurrent.ConcurrentHashMap$HashEntry26:           620          69440  java.util.GregorianCalendar27:          1052          68936  [Ljava.lang.String;

其中:

[C is a char[]
[S is a short[]
[I is a int[]
[B is a byte[]
[[I is a int[][]

上面的输出中[C对象占用Heap这么多,往往跟String有关,String其内部使用final char[]数组来保存数据的。

jstat查看 gc实时执行情况

jstat命令命令格式:

jstat [Options] vmid [interval] [count]

命令参数说明:

Options,一般使用 -gcutil 或  -gc 查看gc 情况

pid,当前运行的 java进程号 
interval,间隔时间,单位为秒或者毫秒 
count,打印次数,如果缺省则打印无数次

Options 参数如下:

-gc:统计 jdk gc时 heap信息,以使用空间字节数表示

-gcutil:统计 gc时, heap情况,以使用空间的百分比表示

-class:统计 class loader行为信息

-compile:统计编译行为信息

-gccapacity:统计不同 generations(新生代,老年代,持久代)的 heap容量情况

-gccause:统计引起 gc的事件

-gcnew:统计 gc时,新生代的情况

-gcnewcapacity:统计 gc时,新生代 heap容量

-gcold:统计 gc时,老年代的情况

-gcoldcapacity:统计 gc时,老年代 heap容量

-gcpermcapacity:统计 gc时, permanent区 heap容量

示例

$ jstat -gc 12538 5000

每5 秒一次显示进程号为 12538的 java进成的 GC情况,结果如下图:

jstat -gcutil 70129  1000

由上图可知,新生代和老年代使用空间百分比接近100%,使用空间已经爆满了。

结果说明

标志

说明

S0C

年轻代中第一个survivor区的容量 (字节)

S1C

年轻代中第二个survivor区的容量 (字节)

S0U

年轻代中第一个survivor区目前已使用空间 (字节)

S1U

年轻代中第二个survivor区目前已使用空间 (字节)

EC

年轻代中Eden的容量 (字节)

EU

年轻代中Eden目前已使用空间 (字节)

OC

Old代的容量 (字节)

OU

Old代目前已使用空间 (字节)

PC

Perm(持久代)的容量 (字节)

PU

Perm(持久代)目前已使用空间 (字节)

YGC

从应用程序启动到采样时年轻代中gc次数

YGCT

从应用程序启动到采样时年轻代中gc所用时间(s)

FGC

从应用程序启动到采样时old代(全gc)gc次数

FGCT

从应用程序启动到采样时old代(全gc)gc所用时间(s)

GCT

从应用程序启动到采样时gc用的总时间(s)

NGCMN

年轻代(young)中初始化(最小)的大小 (字节)

NGCMX

年轻代(young)的最大容量 (字节)

NGC

年轻代(young)中当前的容量 (字节)

OGCMN

old代中初始化(最小)的大小 (字节)

OGCMX

old代的最大容量 (字节)

OGC

old代当前新生成的容量 (字节)

PGCMN

perm代中初始化(最小)的大小 (字节)

PGCMX

perm代的最大容量 (字节)

PGC

perm代当前新生成的容量 (字节)

S0

年轻代中第一个survivor区已使用的占当前容量百分比

S1

年轻代中第二个survivor区已使用的占当前容量百分比

E

年轻代中Eden已使用的占当前容量百分比

O

old代已使用的占当前容量百分比

P

perm代已使用的占当前容量百分比

M jdk1.8 metaspace已使用的占当前容量百分比

S0CMX

年轻代中第一个survivor区的最大容量 (字节)

S1CMX

年轻代中第二个survivor区的最大容量 (字节)

ECMX

年轻代中Eden的最大容量 (字节)

DSS

当前需要survivor区的容量 (字节)(Eden区已满)

TT

持有次数限制

MTT

最大持有次数限制

转载自:jmap输出

Java JVM- jstat查看jvm的GC情况

jmap -histo pid 输出的[C [B [I [S methodKlass constantPoolKlass含义

Java线上应用故障排查之二:高内存占用

jmap和jstat相关推荐

  1. jmap与jstat工具实战分析

    在上一节[https://www.cnblogs.com/webor2006/p/10662363.html]最后其实是抛出了infoq关于元空间介绍的文章中所涉及到JDK自带的一些工具的使用,这次咱 ...

  2. java内存溢出排查jstack_Java命令行监控工具(jmap,jstack,jstat,jinfo,jps)

    项目部署上线之后,线上项目是不能轻易修改的,定位问题的难度也会变大.因此监控是非常重要的一个环节,有了监控,我们才能更好的定位系统中的问题,从而排查.监控的工具有很多种, 但是java自带的命令行监控 ...

  3. JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jstat

    http://my.oschina.net/timer/blog/10599 jstack -- 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和 ...

  4. Java虚拟机学习总结(3)——JDK内置工具(jps、jstack、jmap、jstat)使用详解

    一.JDK内置工具 - javap 1. 介绍 java 反编译工具,主要用于根据Java字节码文件反汇编为Java源代码文件. 2.命令 javap <options> <clas ...

  5. JVM性能调优监控工具专题一:JVM自带性能调优工具(jps,jstack,jmap,jhat,jstat,hprof)...

    2019独角兽企业重金招聘Python工程师标准>>> 前提概要:         JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外 ...

  6. GC调优基础知识之工具篇--jdk为我们提供的命令行命令 jps,jstat,jmap,jinfo,jstat,jstack,jhat 等

    一. JDK为我们提供的工具:    在Windows中对于这些命令的支持是源自JDK -->bin下面的.exe可执行文件的支持.    在Linux中对于这些命令的支持是源自JDK --&g ...

  7. 【JDK工具】jinfo、jps、jstack、jstat、jmap、jconsole

    目录 一.前言 二.关键工具 2.1 jps 显示所有JAVA进程信息 1. 参数信息 2. 常用命令 2.2 jinfo 查看虚拟机配置参数信息 1. 查看虚拟机参数 jinfo -flags pi ...

  8. java jamp cmd,Java命令行监控工具jmap,jstack...

    原标题:Java命令行监控工具jmap,jstack... Java命令行监控工具(jmap,jstack,jstat,jinfo,jps) 项目部署上线之后,线上项目是不能轻易修改的,定位问题的难度 ...

  9. 线上java JVM问题排查

    作者:霞落满天 第一部分  是我以前公司的一则正式案例: 第二部分 是我另一个博客上写的主要是最近发现大家问的比较多就写了此文 第一部分 线上真实故障案例 下面是一个老系统,代码写的有点问题导致出现这 ...

最新文章

  1. 算法炒房三月亏20多亿。房地产巨头大翻车:房价水太深,AI根本把握不住
  2. linux下删除乱码文件
  3. [tomcat7源码学习]结束Bootstrap进入Catalina
  4. Linux系统编程——线程(1)
  5. c/c++,字符,字符串,各种方式读入与对空格,回车的处理
  6. Flink 小贴士 (7): 4个步骤,让 Flink 应用达到生产状态
  7. 运算符的优先级及有哪些运算符
  8. 两个链表是否相交 + 赛马(分桶)
  9. python解决跨域_Python | 跨域
  10. QT延时函数sleep
  11. 利用Xming X Server使用服务器上使用kettle
  12. oracle导出辅助账明细,AO2011导入国库集中支付系统3.0的辅助账资料.doc
  13. 强化学习初探 DQN+PyTorch+gym倒立摆登山车
  14. IDEA解决打开properties乱码问题
  15. JS高频面试题,请查阅,务必收藏持续更新
  16. 使用 PetaLinux 自定义 ZynqMP 平台
  17. 【服务器搭建个人网站】教程二:快速搭建我们服务器 进来看
  18. 利用pdfobject工具处理pdf
  19. 旺旺模块的操作(联系客服)
  20. 离散数学知识点总结(7):谓词逻辑(一阶逻辑):个体词、谓词、量词、特性谓词;特性谓词的常用场景

热门文章

  1. ios APP性能检测
  2. Unity 相机固定角度平移至指定物体
  3. 你这么努力,为何还如此焦虑?
  4. 港科夜闻|香港科大举办网上招生说明会,详细解读招生政策。
  5. 色环电阻是如何读取其标识的?
  6. VMware Workstation 虚拟机不兼容解决方法
  7. pandas 做图显示中文标签
  8. 人机交互新突破:百度发布主动多模态交互技术
  9. excel矩阵小tips
  10. VBA运行将多个excel的矩阵类型数据转为向量数据