G1 old generation committed 内存突然增加,Eden size 减少

Sudden increase in G1 old generation committed memory and decrease in Eden size

出于某种原因,G1 决定增加已提交的老年代内存(尽管已用内存不会增加)并减少 Eden 代提交的内存(因此可用 space)。它似乎导致 GC 的年轻代运行激增,并使应用程序在一段时间内无响应。

我们还可以看到 CPU 使用率和机器中提交的总虚拟内存(大于总物理内存)的峰值。也可能会看到磁盘使用量激增和 swapout/swapin.

我的问题是:

  1. 是否有可能是 G1 决定减小 Eden 大小并大幅增加老年代提交的内存导致所有这些峰值?
  2. 为什么要这样做?
  3. 如何防止它这样做?

JVM 版本:Ubuntu,OpenJDK 运行环境,11.0.11+9-Ubuntu-0ubuntu2.20.04

编辑:似乎导致内存峰值的原因是堆外 JVM 直接缓冲内存池的突然增加。下图显示了 4 个指标的值:os_committed_virtual_memory(蓝色)、node_memory_SwapFree_bytes(红色)、jvm_buffer_pool_used_direct(绿色)和 jvm_buffer_pool_used_mapped(黄色)。这些值以 GB 为单位。

我仍在努力寻找使用此直接缓冲内存的原因以及它对堆内存产生如此影响的原因。

此问题是由与直接内存使用相关的内存泄漏引起的。输出流在使用后未关闭。