我们当前面临一个问题,即我们的主机内存不足。 这些主机上仅运行一个应用程序。
我们首先怀疑JVM导致了问题,并检查了实际的内存使用情况。 JVM运行良好,我们几乎100%确认没有内存泄漏(显示可用内存和已用内存的mem图看起来确实不错,当GC启动时很明显,avg mem的使用率在很长一段时间内保持稳定)。
不过,主机本身上的免费内存会缓慢但稳定地减少,而不会指示正在运行的进程是什么,主机上运行的其他每个服务和守护程序都有稳定的内存使用率。
我们仍然假定应用程序中的某些原因导致了这种情况,但是由于JVM看起来不错,并且我们对可能的内存泄漏的审查并未显示出任何漏洞,因此我们现在有点卡住了...
有什么想法吗?
非常感谢您提出的建议!
答案 0 :(得分:0)
随着时间的推移使用内存的最常见原因是文件缓存中保存着越来越多的文件。这不是问题,因为它是读缓存,操作系统可以随时轻松删除内存。
例如
$ head -5 /proc/meminfo
MemTotal: 131751016 kB
MemFree: 109487136 kB
MemAvailable: 124110416 kB
Buffers: 78400 kB
Cached: 14764024 kB
这台机器有足够的可用内存。但是,如果我访问大量数据。
$ find /opt -print | xargs wc -l
$ head -5 /proc/meminfo
MemTotal: 131751016 kB
MemFree: 105404804 kB
MemAvailable: 124107668 kB
Buffers: 78400 kB
Cached: 18824784 kB
现在,由于文件被缓存,可用内存减少了4 GB。
它们缓存了多长时间?直到
简而言之,JVM可能正在访问文件并将其拉到缓存中,但这并不意味着有问题。
顺便说一句,服务器的通宵备份通常会填满文件缓存,但这是正常的。