JVM-堆-监控-03

jps  :查看当前java进程

jps -l  : 显示应用程序主类的完整包名或应用程序JAR文件的完整路径名

jsp -m:  显示传递给主方法的参数。对于嵌入式JVM,输出可能为null

jps -v:显示传递给JVM的参数

1、首先启动java 程序,并指定使用G1垃圾回收期

#  nohup  java +XX:UseG1GC  -jar test.jar &

2、 查看java进程

# ps -ef |grep java

3、输入jps  查看 java 进程

 

jinfo:查看正在运行的jvm的参数值

jinfo pid

jinfo -flags pid

jinfo -flag 属性 pid 

  看状态   jinfo -flag UseConcMarkSweepGC pid
  看数值   jinfo -flag MaxHeapSize pid

1、查看进程id 或者直接jps也可以查找到pid

2、使用 jinfo 查看运行的jvm 参数值,出来很多信息

# jps 

# jinfo 2837 

 

 

3、使用 jinfo -flags pid  查看(jinfo -flags <pid> 命令用于 查看指定Java进程(JVM)的完整运行时参数配置

 3、使用 jinfo -flag   pid  查看

[root@demo]# jinfo -flag UseConcMarkSweepGC 2837
-XX:-UseConcMarkSweepGC


[root@demo]# jinfo -flag UseG1GC 2837
-XX:+UseG1GC


[root@demo]# jinfo -flag UseG1GC1 2837
no such flag 'UseG1GC1

 4、使用 jinfo -flag  属性  pid  查看 堆的最大内存
[root@demo]# jinfo -flag MaxHeapSize 2837
-XX:MaxHeapSize=517996544
[root@demo]#

典型使用场景

场景命令示例用途
检查垃圾回收器配置 jinfo -flags 1234 确认是否启用G1/CMS/ZGC等
诊断内存溢出问题 结合 -XX:MaxHeapSize 验证堆内存是否合理
排查编码问题 检查 -Dfile.encoding 确认系统默认编码
对比环境差异 对比不同环境的flags输出 定位参数配置不一致导致的性能问题

 

jstat :-gc  查看垃圾回收信息

jstat -gc 1000 [n]

1、查看进程id 或者直接jps也可以查找到pid

2、使用 jinfo 查看运行的jvm 参数值,出来很多信息

jstat -gc 1000 3 每一秒打印一次,总共打印三次

jstat -gc 2000 2 每2秒打印一次,总共打印2次

jstat -gc 2000  每2秒打印一次,一直打印

[root@demo]# jstat -gc 2837 1000 2
S0C S1C S0U S1U EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
0.0 3072.0 0.0 3072.0 24576.0 9216.0 37888.0 26624.0 46848.0 43816.8 6400.0 5822.1 38 0.401 0 0.000 0.401
0.0 3072.0 0.0 3072.0 24576.0 9216.0 37888.0 26624.0 46848.0 43816.8 6400.0 5822.1 38 0.401 0 0.000 0.401

单位都是kb

S0C-》 S0 总的大小

S1C-S1 总的大小

S0U -S0 使用的大小

EC -Eden 伊甸园区使用的大小

OC -old区使用的大小

CCSU -方法区使用的大小

YGC - 年轻代垃圾回收的次数

YGCT -年轻代垃圾回收所消耗的时间

FGC - full GC 的次数

GCT -垃圾回收所消耗总的时间

 

3、jstat -gcutil pid 1000 

 

[root@demo]# jstat -gcutil 2837 1000
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 100.00 37.50 70.27 93.53 90.97 38 0.401 0 0.000 0.401
0.00 100.00 37.50 70.27 93.53 90.97 38 0.401 0 0.000 0.401
0.00 100.00 37.50 70.27 93.53 90.97 38 0.401 0 0.000 0.401
0.00 100.00 37.50 70.27 93.53 90.97 38 0.401 0 0.000 0.401
0.00 100.00 37.50 70.27 93.53 90.97 38 0.401 0 0.000 0.401
0.00 100.00 37.50 70.27 93.53 90.97 38 0.401 0 0.000 0.401
0.00 100.00 37.50 70.27 93.53 90.97 38 0.401 0 0.000 0.401

4、jstat -gccause pid 1000

jstat -gccause <pid> 1000 是一个用于监控 Java 虚拟机(JVM)垃圾回收(GC)统计信息和最近一次 GC 原因的常用命令。以下是详细说明:

命令解析:

  • jstat:JDK 自带的 JVM 统计监控工具。

  • -gccause:选项表示输出 GC 原因(Cause)以及 上次 GC 的原因

  • <pid>:目标 Java 进程的进程 ID。

  • 1000:每隔 1000 毫秒(1 秒)输出一次统计信息。

G1GC

[root@demo]# jstat -gccause 2837 1000
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT LGCC GCC
0.00 100.00 37.50 70.27 93.53 90.97 38 0.401 0 0.000 0.401 G1 Evacuation Pause No GC
0.00 100.00 37.50 70.27 93.53 90.97 38 0.401 0 0.000 0.401 G1 Evacuation Pause No GC
0.00 100.00 37.50 70.27 93.53 90.97 38 0.401 0 0.000 0.401 G1 Evacuation Pause No GC
0.00 100.00 37.50 70.27 93.53 90.97 38 0.401 0 0.000 0.401 G1 Evacuation Pause No GC
0.00 100.00 37.50 70.27 93.53 90.97 38 0.401 0 0.000 0.401 G1 Evacuation Pause No GC
0.00 100.00 37.50 70.27 93.53 90.97 38 0.401 0 0.000 0.401 G1 Evacuation Pause No GC

 

默认GC

[root@demo]# jstat -gccause 4186 1000
S0   S1  E O M CCS YGC YGCT FGC FGCT GCT LGCC GCC
0.00 65.71 85.54 48.63 93.18 89.85 11 0.959 2 0.211 1.170 Allocation Failure No GC
0.00 65.71 85.54 48.63 93.18 89.85 11 0.959 2 0.211 1.170 Allocation Failure No GC
0.00 65.71 85.54 48.63 93.18 89.85 11 0.959 2 0.211 1.170 Allocation Failure No GC

LGCC 上次垃圾啊回收的原因

GCC:当前垃圾回收

 

jmap:查看堆内存信息 

 1、 jmap -heap pid

[root@demo]# jmap -heap 4186

Attaching to process ID 4186, please wait...

Debugger attached successfully.

Server compiler detected.

JVM version is 25.211-b12

 

using thread-local object allocation.

Parallel GC with 2 thread(s)

 

Heap Configuration:

   MinHeapFreeRatio         = 0

   MaxHeapFreeRatio         = 100

   MaxHeapSize              = 517996544 (494.0MB)

   NewSize                  = 11010048 (10.5MB)

   MaxNewSize               = 172490752 (164.5MB)

   OldSize                  = 22544384 (21.5MB)

   NewRatio                 = 2

   SurvivorRatio            = 8

   MetaspaceSize            = 21807104 (20.796875MB)

   CompressedClassSpaceSize = 1073741824 (1024.0MB)

   MaxMetaspaceSize         = 17592186044415 MB

   G1HeapRegionSize         = 0 (0.0MB)

 

Heap Usage:

PS Young Generation

Eden Space:

   capacity = 149422080 (142.5MB)

   used     = 127813264 (121.89222717285156MB)

   free     = 21608816 (20.607772827148438MB)

   85.53840503358005% used

From Space:

   capacity = 11534336 (11.0MB)

   used     = 7579680 (7.228546142578125MB)

   free     = 3954656 (3.771453857421875MB)

   65.71405584161931% used

To Space:

   capacity = 11534336 (11.0MB)

   used     = 0 (0.0MB)

   free     = 11534336 (11.0MB)

   0.0% used

PS Old Generation

   capacity = 35651584 (34.0MB)

   used     = 17336288 (16.533172607421875MB)

   free     = 18315296 (17.466827392578125MB)

   48.62697825712316% used

 

17065 interned Strings occupying 1530264 bytes.

You have new mail in /var/spool/mail/root

 

2、jmap -histo pid 查看对象统计信息

# jmap -histo 4186 会查询出很多西悉尼,因此可以用下面的

# jmap -histo 4186  | head -23 

jmap -histo 4186 | head -23 是一个用于 快速诊断 Java 堆内存对象分布 的命令,它会输出指定 Java 进程(PID 4186)堆内存中占用最多的对象类型,并截取前 23 行关键信息。

[root@demo]# jmap -histo 4186 | head -23

 num     #instances         #bytes  class name

----------------------------------------------

   1:        432760       78988168  [C

   2:         44599       16415384  [B

   3:         31609       11866640  [I

   4:        277988        6671712  java.lang.String

   5:         51977        3505584  [Ljava.lang.Object;

   6:         45900        2937600  java.net.URL

   7:        112056        2296864  [Ljava.lang.Class;

   8:         23781        2092728  java.lang.reflect.Method

   9:         21528        1725568  [Ljava.util.WeakHashMap$Entry;

  10:         21397        1369408  org.springframework.boot.loader.jar.JarFileWrapper

  11:         39788        1273216  java.util.concurrent.ConcurrentHashMap$Node

  12:         38075        1218400  org.springframework.boot.loader.jar.StringSequence

  13:         27337        1093480  java.lang.ref.Finalizer

  14:          9463        1038976  java.lang.Class

  15:         21514        1032672  java.util.WeakHashMap

  16:         38075         913800  org.springframework.boot.loader.jar.JarURLConnection$JarEntryName

  17:         21774         870960  java.util.LinkedHashMap$Entry

  18:         11086         862976  [Ljava.util.HashMap$Node;

  19:         22559         721888  java.lang.ref.ReferenceQueue

  20:          8746         693600  [S

[C
字符数组
char[]
[B
字节数组
byte[]
[I
整形数组
int[]
5、jmap -histo 10874 | less ,先出来一部分,可以按键分页查看
jmap -histo 10874 | less 是一个用于 交互式浏览 Java 堆内存对象分布 的命令,它结合了 jmap 的内存统计功能和 less 的分页查看工具。
 
6、dump出堆内存
使用场景:在性能压测过程中出现OAM的情况 ,可以使用dump 堆内存进行分析
在性能压测(Performance Testing)上下文中提到的 OAM,通常指的是 运维管理(Operations, Administration, and Maintenance),

性能压测中的 OAM 场景

  1. 核心作用
    在压测过程中,OAM 系统负责:

    • 实时监控:跟踪服务器CPU、内存、网络I/O、数据库连接池等关键指标。

    • 故障告警:自动检测异常(如接口超时、错误率飙升)并触发告警。

    • 日志收集:记录压测期间的详细日志,供后续分析瓶颈。

  2. 典型问题与OAM的关联

    • 资源泄漏:OAM 监控到内存或线程数持续增长,可能提示代码未释放资源(如数据库连接未关闭)。

    • 配置错误:OAM 发现某服务线程池配置过小,导致压测时请求排队。

    • 网络瓶颈:OAM 显示带宽占用饱和,需调整负载均衡策略。

    • OAM 在压测中的关键工具

      工具/组件用途示例
      Prometheus+Grafana 实时监控指标可视化 观察QPS、延迟、错误率变化曲线
      ELK Stack 集中分析压测日志 搜索高频错误日志(如 TimeoutException
      Zabbix/Nagios 阈值告警 CPU超过90%时邮件通知团队
      APM工具(如SkyWalking) 追踪分布式链路性能 定位慢调用链(如某个微服务接口耗时突增)

       

       

      手动dump 命令:jmap -dump:live,format=b,file=heap.bin 4168(pid)

      [root@demo]# jmap -dump:live,format=b,file=heap.bin 4186

      Dumping heap to /root/demo/heap.bin ...

      Heap dump file created

      [root@demo]# ls 

       heap.bin                     nohup.out   testdemo  test.txt_bak

      [root@demo]# 

      dump 文件 heap.bin 后,通过MAT工具去分析,看是哪个对象占用了过多内容,到底是内部程序导致的,还是什么导致的OMA.

      在 Java 性能分析和内存泄漏排查中,MAT(Memory Analyzer Tool) 是一款专用于分析 Java 堆转储文件(Heap Dump)的强大工具。它可以帮助开发者快速定位内存消耗过高、对象泄漏等问题的根源

      . MAT 是什么?

      • 全称:Eclipse Memory Analyzer Tool(独立版或 Eclipse 插件)。

      • 核心功能:解析由 jmapjcmd 或 OOM 自动生成的堆转储文件(如 heap.bin),提供可视化分析。

      • 适用场景:

        • 内存泄漏(Memory Leak)诊断。

        • 大对象(Retained Heap)占用分析。

        • 对象引用链追踪。

      • 4. 实际案例演示

        问题现象

        压测时 JVM 内存持续增长,Full GC 无法回收,最终 OOM。

        MAT 分析过程

        1. 生成堆转储

          bash
           
          复制
           
          下载
          jmap -dump:live,format=b,file=heap.bin 4168
        2. MAT 加载文件

          • 发现 com.example.OrderService 的实例占用了 80% 内存。

        3. 引用链分析

          • 该对象被一个全局的 ConcurrentHashMap 缓存持有,无过期策略。

        4. 解决方案

          • 改用 Caffeine 缓存并设置TTL,或定期清理缓存。

            • 6. 替代工具对比

              工具优势劣势
              MAT 深度引用分析,自动化报告 大堆文件解析慢
              VisualVM 轻量级,实时监控 分析功能较弱
              JProfiler 商业版,集成 CPU/内存分析 付费

jstat -gccause <pid> 1000 是一个用于监控 Java 虚拟机(JVM)垃圾回收(GC)统计信息和最近一次 GC 原因的常用命令。以下是详细说明:

命令解析:

  • jstat:JDK 自带的 JVM 统计监控工具。

  • -gccause:选项表示输出 GC 原因(Cause)以及 上次 GC 的原因

  • <pid>:目标 Java 进程的进程 ID。

  • 1000:每隔 1000 毫秒(1 秒)输出一次统计信息。

posted @ 2025-05-28 11:43  Shafir莎菲尔  阅读(25)  评论(0)    收藏  举报