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。

      <think>好的,用户想知道如何在Linux服务器上监控Java程序内存使用情况。我需要先回忆一下常用的Linux工具和方法。首先,jstat是JDK自带的工具,可以监控JVM内存和GC情况,这个应该提一下。然后是jcmd,可以用来生成堆转储或者查看内存信息。还有top和htop命令,可以实时查看进程的内存占用,但可能需要结合Java的特定参数来分析。另外,VisualVM或者JConsole这些图形化工具,不过服务器环境可能没有图形界面,所以可能需要用JMX远程连接。此外,像jmap这样的工具可以生成堆转储文件,用于后续分析。还有,ps命令也可以查看进程的内存使用情况,比如RSS和VSZ。另外,用户可能不仅想知道实时监控,还可能需要进行内存分析,比如查找内存泄漏,这时候可能需要堆转储分析工具,比如Eclipse MAT。另外,要注意不同工具显示的内存指标代表的含义,比如堆内存、非堆内存、直接内存等。可能还需要提到如何配置JVM参数来启用监控,比如开启JMX端口。用户的问题主要集中在监控,所以重点放在实时监控工具和常用命令上,同时可以简要提到进一步分析的步骤。需要确保提到的每个工具都有具体的使用示例,比如jstat的命令行参数,top的使用方法,jmap生成堆转储的命令等。此外,要提醒用户权限问题,比如有些命令可能需要Java进程运行的用户权限才能执行。最后,可能需要总结一下各个工具的适用场景,帮助用户根据需求选择合适的方法。</think>在Linux服务器中监控Java程序内存使用情况,可通过以下5种核心方法实现: ### 一、JVM内置工具 1. **jstat命令** 实时监控堆内存和GC情况: ```bash jstat -gc <pid> 1000 # 每1秒输出一次内存统计 ``` 关键指标说明: - S0C/S1C:Survivor区容量 - EC:Eden区容量 - OC:老年代容量 - MU:元空间使用量 - FGC:Full GC次数[^1] 2. **jcmd诊断** 获取详细内存映射: ```bash jcmd <pid> VM.native_memory ``` ### 二、操作系统工具 1. **top命令实时监控** ```bash top -p <pid> # 查看RES(物理内存)和VIRT(虚拟内存) ``` 2. **pmap分析内存映射** ```bash pmap -x <pid> | less # 显示详细内存分配 ``` ### 三、堆转储分析 1. **生成堆转储文件** ```bash jmap -dump:live,format=b,file=heapdump.hprof <pid> ``` 2. **使用MAT分析工具** 下载Eclipse Memory Analyzer分析heapdump文件,可检测内存泄漏[^2] ### 四、JMX远程监控 1. 启动JVM时添加参数: ```bash -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false ``` 2. 使用JConsole或VisualVM连接JMX端口 ### 五、NMT(Native Memory Tracking) 1. 启动时开启追踪: ```bash -XX:NativeMemoryTracking=detail ``` 2. 运行时查看: ```bash jcmd <pid> VM.native_memory detail ``` $$ \text{总内存使用量} = \text{堆内存} + \text{非堆内存} + \text{直接内存} $$
      评论
      成就一亿技术人!
      拼手气红包6.0元
      还能输入1000个字符
       
      红包 添加红包
      表情包 插入表情
       条评论被折叠 查看
      添加红包

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

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

      抵扣说明:

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

      余额充值