当前位置: 首页 > news >正文

使用Tomcat部署war包查看内存使用情况

前言:

        使用Tomcat部署多个war包,只有一个Java进程,使用常用方式只能看到整体占用内存情况。比如ps -aux 查看进程详情,或者使用jmap -heap查看JVM堆内存。

        如果想要看到每个war包对应的服务占用多少内存,提供如下两种简单的方式。

方式一:配置Actuator端点

1、在项目配置文件中添加

# 开放端点

management.endpoints.web.exposure.include=health,info,metrics

# 是否开启metrics端点,可以不配置

management.endpoint.metrics.enabled=true

2、用法

(1)查看全部指标

http://ip:port/actuator/metrics

{"names": ["jvm.buffer.count","jvm.buffer.memory.used","jvm.buffer.total.capacity","jvm.classes.loaded","jvm.classes.unloaded","jvm.gc.live.data.size","jvm.gc.max.data.size","jvm.gc.memory.allocated","jvm.gc.memory.promoted","jvm.gc.pause","jvm.memory.committed","jvm.memory.max","jvm.memory.used","jvm.threads.daemon","jvm.threads.live","jvm.threads.peak","jvm.threads.states","logback.events","process.cpu.usage","process.files.max","process.files.open","process.start.time","process.uptime","system.cpu.count","system.cpu.usage","system.load.average.1m","tomcat.cache.access","tomcat.cache.hit","tomcat.global.error","tomcat.global.received","tomcat.global.request","tomcat.global.request.max","tomcat.global.sent","tomcat.servlet.error","tomcat.servlet.request","tomcat.servlet.request.max","tomcat.threads.busy","tomcat.threads.config.max","tomcat.threads.current"]
}

常用内置指标端点

指标类别端点路径示例说明
JVM内存/actuator/metrics/jvm.memory.usedJVM内存使用情况
HTTP请求/actuator/metrics/http.server.requestsWeb请求统计
系统CPU/actuator/metrics/system.cpu.usageCPU使用率
垃圾收集/actuator/metrics/jvm.gc.pauseGC暂停时间
进程信息/actuator/metrics/process.uptime应用运行时间

(2)查看内存

http://ip:port/actuator/metrics/jvm.memory.used

说明:value是jvm全部占用内存,包括堆(PS Eden Space、PS Survivor Space、PS Old Gen)和非堆(Metaspace、Compressed Class Space、Code Cache)空间,单位bytes。转换成MB(/1024/1024)。

{"name": "jvm.memory.used","description": "The amount of used memory","baseUnit": "bytes","measurements": [{"statistic": "VALUE","value": 9897020928}],"availableTags": [{"tag": "area","values": ["heap","nonheap"]},{"tag": "id","values": ["Compressed Class Space","PS Survivor Space","PS Old Gen","Metaspace","PS Eden Space","Code Cache"]}]
}

(3)查看内存详细指标

格式:jvm.memory.used?tag=area:heap

比如,堆内存:http://ip:port/actuator/metrics/jvm.memory.used?tag=area:heap

{"name": "jvm.memory.used","description": "The amount of used memory","baseUnit": "bytes","measurements": [{"statistic": "VALUE","value": 8406602104}],"availableTags": [{"tag": "id","values": ["PS Eden Space","PS Survivor Space","PS Old Gen"]}]
}

非堆内存:http://ip:port/actuator/metrics/jvm.memory.used?tag=area:nonheap

{"name": "jvm.memory.used","description": "The amount of used memory","baseUnit": "bytes","measurements": [{"statistic": "VALUE","value": 1519950712}],"availableTags": [{"tag": "id","values": ["Metaspace","Compressed Class Space","Code Cache"]}]
}

方式二:通过代码获取

import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.MemoryPoolMXBean;
import java.lang.management.MemoryUsage;public class MemoryMonitor {public static void main(String[] args) {// 获取堆内存使用MemoryMXBean memoryMxBean = ManagementFactory.getMemoryMXBean();MemoryUsage heapUsage = memoryMxBean.getHeapMemoryUsage();System.out.println("Heap Memory Used: " + heapUsage.getUsed() / 1024 / 1024 + " MB");// 获取各内存池详情for (MemoryPoolMXBean pool : ManagementFactory.getMemoryPoolMXBeans()) {MemoryUsage usage = pool.getUsage();System.out.printf("Pool: %s, Used: %d MB%n", pool.getName(), usage.getUsed() / 1024 / 1024);}}
}

输出:

Memory Monitor:
Heap Memory Used: 7931 MB
Pool: Code Cache, Used: 152 MB

Pool: Metaspace, Used: 1149 MB

Pool: Compressed Class Space, Used: 144 MB

Pool: PS Eden Space, Used: 2060 MB

Pool: PS Survivor Space, Used: 140 MB

Pool: PS Old Gen, Used: 5730 MB

关键内存区域说明

内存区域说明
G1 Eden Space年轻代Eden区,新对象首先分配在这里
G1 Survivor Space年轻代Survivor区,存放从Eden区GC后存活的对象
G1 Old Gen老年代,存放长期存活的对象
Metaspace存储类元数据(取代永久代),不包含在堆内存中
Code CacheJIT编译后的本地代码存储区域
Compressed Class Space压缩指针使用的类空间
http://www.xdnf.cn/news/366139.html

相关文章:

  • 【0-3h PN相关2】GNSS天顶总延迟数据同化对意大利短期水汽和降水预报影响的研究
  • c++:编译链接过程
  • 40-算法打卡-二叉树-深度优先(前、中、后序遍历)-递归遍历-第四十天
  • Langchain、RAG、Agent相关
  • 【MyBatis-6】MyBatis动态SQL:灵活构建高效数据库查询的艺术
  • AI融合SEO关键词智能优化
  • 三轴云台之视觉跟踪系统篇
  • 算法设计与分析复习代码(hnust)
  • 聊一部很癫的电影
  • 数据结构与算法分析实验10 实现最短路径算法
  • Linux——多线程
  • 前端常见七种报错类型及解决方案
  • Linux vi/vim编辑器常用命令
  • 多分类问题softmax传递函数+交叉熵损失
  • 嵌入式学习笔记 - 关于结构体成员地址对齐问题
  • Edu教育邮箱申请成功下号
  • Knife4j文档的会被全局异常处理器拦截的问题解决
  • Python MNE-Python 脑功能磁共振数据分析
  • IO-Link系列集线器(三格电子)
  • MySQL 安全架构:从渗透测试到合规审计
  • 对称加密以及非对称加密
  • 从零理解 RAG:检索增强生成的原理与优势
  • Linux系统Shell脚本之sed
  • 深度学习-161-Dify工具之对比使用工作流和聊天流生成图表可视化的html文件
  • css样式实现-新闻列表
  • MySQL相关查询
  • 在 MyBatis 中实现控制台输出 SQL 参数
  • htmlUnit和Selenium的区别以及使用BrowserMobProxy捕获网络请求
  • RoPE长度外推:外插内插
  • ResNet详解