java - 为什么即使对于开箱即用的 Spring Boot 管理员,Java 进程的 RES 内存也会保持缓慢增长?

标签 java linux spring-boot memory jvm

我有 23 个 Java 进程在一台 32GB 的机器上运行。没有进程指定 JVM 内存参数,例如 Xmx。 java -XX:+PrintFlagsFinal -version | grep MaxHeapSize 报告最大默认堆大小为预期的 8GB。
每个进程都运行嵌入式 Tomcat(Spring Boot 应用程序(大多数在 v 2.3.4)),除了一个是运行三个 WAR 的独立 tomcat 9 实例。这些应用的使用率很低(通常是一个用户,每天使用 10 分钟)。它们不是内存或 CPU 密集型的。其中之一是 Spring Boot admin,另一个是 Spring Cloud 的 Eureka 服务注册中心。对于这两个,我只有一个简单地引导 Spring Boot 应用程序的 main 方法。
然而,每个进程的顶部显示的 RES 内存一直在逐渐增加。例如,Spring Boot 服务注册表在过去 12 小时内从 1.1GB 增加到 1.5GB。所有进程都显示 RES 类似的小幅增加,但在相同的 12 小时内,总增加使可用内存减少了 2 GB。这与前 12 小时(以此类推)相同,直到当前可用内存现在只有 4.7GB。
我担心的是我会继续看到这种趋势(即使没有使用应用程序)。内存永远不会从应用程序中释放,因此总可用内存继续减少。这是正常的,因为也许每个 JVM 都看到操作系统中的内存仍然可用,并且有 8GB 的​​堆空间可供它使用?一旦达到操作系统可用内存阈值,JVM 会停止占用内存吗?还是会一直持续到所有空闲内存都用完?
更新
大多数应用程序使用的堆小于 200MB,但堆大小为 1.5 - 2.8GB。堆最大为 8GB。

最佳答案

操作系统报告的驻留内存不会告诉您哪个组件正在消耗它。您必须收集额外的数据才能确定流程的哪一部分正在增长
你必须跟踪

  • java 堆和元空间使用 - 您可以使用 JMC 、gc 日志记录和许多其他 java 监控工具来监控它
  • jvm 堆外使用 - NMT
  • 直接字节缓冲区使用 - MX beans ,也可通过 JMC 获得
  • 被映射文件使用 - pmap -x <pid>
  • 被本地库使用,例如通过 JNI 使用 - 难以监控
  • 关于java - 为什么即使对于开箱即用的 Spring Boot 管理员,Java 进程的 RES 内存也会保持缓慢增长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64593968/

    相关文章:

    java - 来自另一个类的多个 JButton Action 监听器

    css 不会在此元素中加载。但 css 在其他元素中工作顺利

    java - Spring在测试期间从包私有(private)类获取配置

    Java - 比较器

    java - 取消固定后数据保留在本地数据存储中

    linux - 比较 bash 脚本中的 md5 总和

    用.a文件编译c文件的命令

    java - 基本身份验证在 Spring-Boot WS Soap 服务中不起作用

    c# - Java 版本的 c# Array.Copy(Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length)

    c - 使用 fopen 和 fscanf 将函数从 C 重写为汇编