Skip to content

线上JVM内存溢出排查

模拟内存溢出

设置启动参数

  • -Xms100m -Xmx100m -XX:+HeapDumpOnOutOfMemoryError
    • -Xms:堆的最小值
    • -Xmx:堆空间的最大值
    • -XX:+HeapDumpOnOutOfMemoryError 当OOM发生时自动dump堆内存信息
    • -XX:HeapDumpOnOutOfMemoryError=/temp/heapdump.hprof dump堆内存信息存放目录

模拟内存飙升

访问:http://127.0.0.1:8080/prometheus/test/testUp1

http://127.0.0.1:8080/prometheus/test/testUp2

jps 查看引用进程

jmap -dump:format=b,file=/home/dump.out pid

http://ip:port/actuator/heapdump

模拟内存溢出

访问:http://127.0.0.1:8080/prometheus/test/testOutOfMemory

内存溢出问题分析

打开mat

20251206233403dbe615d01.png

载入dump文件

File - > Open Heap Dump - >选择我们的dump文件(注意文件类型选择All Files或者*.hprof)

分析界面

  • 在Overview界面点击我们的Dominator Tree 查看内存占用情况(按内存占比从大到小顺序排列)

20251206233403d497ca5e6.png

202512062334037ec20a22d.png

  • 点击Leak Suspects 可以看到工具帮我们分析出来的问题项 ,点击Details可以查看详情

20251206233403ba847ac8a.png

202512062334037f4abfd08.png

SpingBoot项目搭建

添加maven依赖

xml
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
  <groupId>io.micrometer</groupId>
  <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

配置application.properties

properties
server.port=8080
spring.application.name=prometheus-jvm
management.endpoints.web.exposure.include=*
management.metrics.tags.application=${spring.application.name}

添加监控JVM的配置类

java
@Bean
public MeterRegistryCustomizer<MeterRegistry> configurer(@Value("${spring.application.name}") String applicationName){
    return registry -> registry.config().commonTags("application", applicationName);
}

启动SpringBoot项目

启动成功后,访问http://127.0.0.1:8080/actuator/prometheus查看指标是否正常

Prometheus搭建

下载地址

https://prometheus.io/download/

prometheus.yml添加配置

shell
#名称随便取
 - job_name: "prometheus-jvm"
    # 多久采集一次数据
    scrape_interval: 5s
    # 采集时的超时时间
    scrape_timeout: 5s
    # 采集的路径
    metrics_path: '/actuator/prometheus'
    # 采集SpringBoot的服务地址
    static_configs:
       - targets: ['127.0.0.1:8080']

最终是这个样子

20251206233403718e6c8d4.png

windows下启动 prometheus

在prometheus文件目录下执行,prometheus.exe --config.file=prometheus.yml

202512062334035a5b2e5cb.png

访问:http://127.0.0.1:9090/targets

Grafana搭建

下载地址

https://grafana.com/grafana/download?pg=get&platform=windows&plcmt=selfmanaged-box1-cta1

启动

  • 解压完直接进入bind目录,双击grafana-server.exe启动服务
  • 访问:http://127.0.0.1:3000/
  • 用户名密码随便输入,自己记住

配置模板

配置prometheus数据源

点击Prometheus

2025120623340319efff105.png

202512062334036d53d2bec.png

导入模板

202512062334036078eb14b.png

2025120623340399b383dea.png

更新: 2023-04-14 20:36:49
原文: https://www.yuque.com/tulingzhouyu/sfx8p0/qdh0ck3zzgqew1b3