Linux下分析Java程序内存(pmap、jmap、jstat)

1、pmap查看进程内存

运行命令

使用pmap可以查看某一个进程(非java的也可以)的内存使用使用情况,

命令格式:
pmap 进程id
 
 
    示例说明
    pmap 12358
     
     

      第一列,内存块起始地址
      第二列,占用内存大小
      第三列,内存权限
      第四列,内存名称,anon表示动态分配的内存,stack表示栈内存
      最后一行,占用内存总大小,请注意,此处为虚拟内存大小,占用的物理内存大小可以通过top查看

      这里写图片描述

      2、jmap查看Java进程对象使用情况

      运行命令

      使用jmap可以查看某个Java进程中每个对象有多少个实例,占用多少内存,
      命令格式:

      jmap -histo 进程id
       
       
      • 1
      示例说明
      jmap -histo  12538
       
       
      • 1

      第一列,序号,无实际意义
      第二列,对象实例数量
      第三列,对象实例占用总内存数,单位:字节
      第四列,对象实例名称
      最后一行,总实例数量与总内存占用数

      这里写图片描述

      这里写图片描述

      jmap -heap 1024 > jmap-heap-1024.bin
       
       
      • 1

      这里写图片描述

      3、jstat命令查看jvm的GC情况

      jstat命令格式:
      jstat [Options] vmid [interval] [count]
       
       
      • 1
      参数说明:

      Options,选项,我们一般使用 -gcutil 查看gc情况
      vmid,VM的进程号,即当前运行的java进程号
      interval,间隔时间,单位为秒或者毫秒
      count,打印次数,如果缺省则打印无数次

      示例说明
      jstat -gc 1024 5000
       
       
      • 1

      即会每5秒一次显示进程号为1024的java进成的GC情况

      这里写图片描述

      显示内容说明如下(部分结果是通过其他其他参数显示的,暂不说明):

      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代已使用的占当前容量百分比
      S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (字节)
      S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节)
      ECMX:年轻代中Eden(伊甸园)的最大容量 (字节)
      DSS:当前需要survivor(幸存区)的容量 (字节)(Eden区已满)
      TT: 持有次数限制
      MTT : 最大持有次数限制

      Java 堆分为新生代和老年代,新生代一般划分为三块区域,Eden + From Survivor + To Survivor,Eden 和 Survivor 的内存比为8:1,每次只使用一个Eden 和一个 Survivor 区域,另一个 Survivor 用于复制收集算法回收内存。

      对象一般尽量分配到新生代中,而对于大对象(长字符串和大数组)直接分配在老年代中,同时“年龄”长的的对象会从新生代自动晋升到老年代中。

      Java 方法区称为永久代,只有 HotSpot 虚拟机才存在永久代。

      当 Eden 区域分配不足时,自动发生一次 Minor GC。

      当发生 Minor GC 时,虚拟机会自动检测(比较)新生代晋升到老年代的对象内存大小和老年代剩余内存大小,如果晋升>剩余,则发生一次Full GC;如果晋升<剩余,则去检测老年代的内存担保 HandlePromotionFailure 是否允许担保失败,如果不允许担保失败,则发生一次Full GC,如果允许失败,则进行一次Minor GC。

      • 0
        点赞
      • 4
        收藏
        觉得还不错? 一键收藏
      • 0
        评论
      评论
      添加红包

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

      当前余额3.43前往充值 >
      需支付:10.00
      成就一亿技术人!
      领取后你会自动成为博主和红包主的粉丝 规则
      hope_wisdom
      发出的红包
      实付
      使用余额支付
      点击重新获取
      扫码支付
      钱包余额 0

      抵扣说明:

      1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
      2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

      余额充值