我遇到了服务器物理内存不足的问题,我无法辨别这是由我的应用程序的 Java 进程还是服务器上的其他程序引起的。让我们来看看以下场景:
服务器物理内存:3747MB
Java -Xms64m
Java -Xmx512m
Java XX:MaxPermSize=512m
当我启动服务器时,操作系统 (RHEL) 使用您最喜欢的内存报告工具 (top, cat /proc/meminfo | grep Mem, free -m
等) 报告已使用 487MB。当我启动 Java 进程 (pid 123) 时,它使用大约 215MB 的物理内存(由 中的 RES 内存报告ps -f -p 123
),使我的总使用内存达到约 700MB。
如果我让它运行一整天,我的进程的 RES 内存会有些波动,但总体上是一致的。然而,服务器总内存稳步增加到 1500MB 左右,达到 2200MB。
如果我的 java 堆大小或永久代堆不断增长,那么它不会反映在进程的 RES 内存中吗?
此外,我似乎无法在任何地方解释那额外的 1500MB。
# ps aux | awk '{ RES+=$6 } END { printf("RES: %.2fMB\n", RES/1024) }'
RES: 722.23MB
有人能帮我找到丢失的内存吗?我基本上想弄清楚这是我的应用程序的问题,还是基础设施团队在服务器构建方面的问题。
答案1
Linux 使用回收策略,但不将最近使用的任何内存标记为“真正空闲”(理论上,清除内存需要花费精力,而将内存留在那里以备有人再次使用则无需花费任何成本,而且可以节省一大笔钱)。不要担心“空闲内存”报告。查看正在使用多少交换空间(如果有的话)(交换空间本质上是用于内存需求的磁盘空间,这些内存需求确实会溢出物理内存;磁盘速度极慢,您不需要它)。如果您担心性能,请安装和配置监控软件,例如臭名昭著的 sar(系统状态(当然,肯定有一个适用于您系统的软件包),它将详细记录正在发生的事情,以供日后查阅。有了这些报告,您就会知道您的瓶颈是什么(如果有的话)。“过早优化是万恶之源”这个俏皮话是因为人们臭名昭著无法猜测真正的性能问题出在哪里,最终“修复”一些运行良好的东西。