识别丢失的物理内存

sch*_*d04 7 memory linux java memory-leaks redhat-enterprise-linux

我遇到了服务器物理内存不足的问题,我无法辨别它是来自我的应用程序的 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 堆大小或 perm gen 堆在增长,它不会反映在进程的 RES 内存中吗?

此外,我似乎无法在任何地方考虑额外的 1500MB。

# ps aux | awk '{ RES+=$6 } END { printf("RES: %.2fMB\n", RES/1024) }'
RES: 722.23MB
Run Code Online (Sandbox Code Playgroud)

谁能帮我找回丢失的记忆?我基本上是想弄清楚这是我的应用程序问题,还是基础架构团队的服务器构建问题。

von*_*and 1

Linux 使用回收策略,但不会将任何最近使用的内存标记为“真正空闲”(其理论是,清理内存需要花费精力,而将这些东西留在周围以防有人再次使用它,而不需要任何成本,并且可能会节省很多)。不用担心“可用内存”报告。查看正在使用多少(如果有)交换区(交换区本质上是满足内存要求的磁盘空间,实际上会溢出物理内存;磁盘速度非常慢,您不想需要它)。如果您担心性能,请安装和配置监控软件,例如臭名昭​​著的 sar(sysstat,肯定有适合您系统的软件包),它会详细记录正在发生的事情以供以后细读。有了上述报告,您就会知道您的瓶颈是什么(如果有的话)。有句俏皮话“过早的优化是万恶之源”是因为人们非常不善于猜测真正的性能问题在哪里,并且最终“修复”运行得很好的东西。