java - 系统的Active Memory不断增加
问题描述
我看到托管 JVM 的 Linux 机器上的 Active Memory 有所增加。Java进程使用的内存大致相同,为6.1G。
21442 nobody 20 0 13.1g 6.1g 64m S 33.9 39.2 1677:39 java
我想知道问题的原因可能是什么,如果就如何调试这个问题给出一些建议会很有帮助。
连续几天同时测量的 /proc/meminfo 样本如下
第1天
MemTotal: 16434272 kB
MemFree: 2066644 kB
MemAvailable: 8221744 kB
Buffers: 364212 kB
Cached: 5487632 kB
SwapCached: 0 kB
Active: 9836280 kB
Inactive: 3899908 kB
Active(anon): 7884360 kB
Inactive(anon): 120 kB
Active(file): 1951920 kB
Inactive(file): 3899788 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 7164 kB
Writeback: 0 kB
AnonPages: 7884404 kB
Mapped: 185276 kB
Shmem: 128 kB
Slab: 514228 kB
SReclaimable: 482620 kB
SUnreclaim: 31608 kB
KernelStack: 9248 kB
PageTables: 26988 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 8217136 kB
Committed_AS: 13542340 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 0 kB
VmallocChunk: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 12288 kB
DirectMap2M: 2084864 kB
DirectMap1G: 15728640 kB
第2天
MemTotal: 16434272 kB
MemFree: 1211928 kB
MemAvailable: 7985664 kB
Buffers: 365508 kB
Cached: 6099704 kB
SwapCached: 0 kB
Active: 10566764 kB
Inactive: 4018780 kB
Active(anon): 8120344 kB
Inactive(anon): 120 kB
Active(file): 2446420 kB
Inactive(file): 4018660 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 9504 kB
Writeback: 0 kB
AnonPages: 8120352 kB
Mapped: 182616 kB
Shmem: 128 kB
Slab: 519364 kB
SReclaimable: 487884 kB
SUnreclaim: 31480 kB
KernelStack: 9184 kB
PageTables: 26920 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 8217136 kB
Committed_AS: 13320036 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 0 kB
VmallocChunk: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 12288 kB
DirectMap2M: 2084864 kB
DirectMap1G: 15728640 kB
第3天
MemTotal: 16434272 kB
MemFree: 1136836 kB
MemAvailable: 7668800 kB
Buffers: 365820 kB
Cached: 5866988 kB
SwapCached: 0 kB
Active: 11092372 kB
Inactive: 3576692 kB
Active(anon): 8436276 kB
Inactive(anon): 120 kB
Active(file): 2656096 kB
Inactive(file): 3576572 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 4940 kB
Writeback: 0 kB
AnonPages: 8436320 kB
Mapped: 187980 kB
Shmem: 128 kB
Slab: 509852 kB
SReclaimable: 478524 kB
SUnreclaim: 31328 kB
KernelStack: 9296 kB
PageTables: 27992 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 8217136 kB
Committed_AS: 13516284 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 0 kB
VmallocChunk: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 12288 kB
DirectMap2M: 2084864 kB
DirectMap1G: 15728640 kB
解决方案
如果 JVM 系统进程的内存使用量随着时间的推移而增加,那并不一定意味着您有内存泄漏。JVM 有两个参数:一个是要分配的初始系统内存量 ( -Xms
),另一个是允许分配的最大内存量 ( -Xmx
)。如果没有明确指定,JVM 会根据运行系统的规范选择一个值。
当运行的 java 应用程序需要的堆空间超过当前分配的系统内存时,JVM 将逐渐分配更多的系统内存(直到指定的最大值)。一旦分配,JVM 可能不会再次释放该系统内存,即使分配的堆空间量下降(例如,当执行垃圾收集时)。此行为可能因 JVM 的实际实现而异。
如果您看到您的 JVM 系统进程达到 6.1 GB 的峰值,这可能是配置的最大数量。
在您的日志文件中看到 OutOfMemoryErrors 将暗示可能存在泄漏。如果您想知道 JVM 内存中发生了什么,您可以创建一个堆转储文件并使用Eclipse Memory Analyzer 之类的工具进行分析。您可以将-XX:+HeapDumpOnOutOfMemoryError
命令行参数添加到 JVM 以使其在 OutOfMemoryError 发生时自动创建堆转储文件。
推荐阅读
- bash - Bash Weirdness:与条件相关的算术表达式的退出代码。真/假与成功/失败
- android - 在Production Playstore App上没有答案的Flutter DialogFlow
- android - 前台服务 - 设置不确定的进度条
- mockito - 为什么@Spy 仅用于依赖项?
- azure - Azure 服务总线会话是否保证 FIFO 顺序?
- python - 在Python中每组每3行分组和求和
- shell - shell find - 获取当前文件的文件夹名称
- font-awesome - 带有tailwindcss的字体真棒响应大小
- javascript - 从 iframe 源将元素从父级移动到 iframe
- javascript - npm 注册表中 lodash tarball 中的额外文件