首页 > 解决方案 > 系统的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

标签: javalinuxmemorymemory-leaksjvm

解决方案


如果 JVM 系统进程的内存使用量随着时间的推移而增加,那并不一定意味着您有内存泄漏。JVM 有两个参数:一个是要分配的初始系统内存量 ( -Xms),另一个是允许分配的最大内存量 ( -Xmx)。如果没有明确指定,JVM 会根据运行系统的规范选择一个值。

当运行的 java 应用程序需要的堆空间超过当前分配的系统内存时,JVM 将逐渐分配更多的系统内存(直到指定的最大值)。一旦分配,JVM 可能不会再次释放该系统内存,即使分配的堆空间量下降(例如,当执行垃圾收集时)。此行为可能因 JVM 的实际实现而异。

如果您看到您的 JVM 系统进程达到 6.1 GB 的峰值,这可能是配置的最大数量。

在您的日志文件中看到 OutOfMemoryErrors 将暗示可能存在泄漏。如果您想知道 JVM 内存中发生了什么,您可以创建一个堆转储文件并使用Eclipse Memory Analyzer 之类的工具进行分析。您可以将-XX:+HeapDumpOnOutOfMemoryError命令行参数添加到 JVM 以使其在 OutOfMemoryError 发生时自动创建堆转储文件。


推荐阅读