CentOS服务器。 当使用的RAM总数不等于RES的总和时,这意味着什么?

我在运行CentOS的虚拟主机服务器上遇到问题。 在过去的一个月中,一个已经正常运行的进程(基于java的)开始在JVM启动时获取内存时出现问题。

我注意到的一个奇怪的事情是,当我开始这个过程时,PID表示它正在使用470MB的RAM,而“已用”内存立即下降超过1GB。 如果我运行“顶级”,所有进程中使用的总体RES就比上面列出的“使用”差了近700mb。

支持人员说,这意味着我的进程有内存泄漏。 我不知道要相信什么,因为我期望内存泄漏只是浪费分配进程的内存,而不是消耗使用“top”不显示的额外内存。

我是一个开发人员,而不是服务器人,所以我向专家求助。 对我来说,如果总的RES内存不加总到“使用”,这表明我的虚拟服务器设置有问题。 我应该怀疑在这种情况下泄漏java进程的内存?

如果我以前free使用:

  total used free shared buffers cached Mem: 2097152 149264 1947888 0 0 0 -/+ buffers/cache: 149264 1947888 Swap: 0 0 0 

free后:

  total used free shared buffers cached Mem: 2097152 1094116 1003036 0 0 0 -/+ buffers/cache: 1094116 1003036 Swap: 0 0 0 

所以看起来好像这个进程正在使用(或正在使用)近1GB的RAM。 由于该进程(基于top仅使用470MB,这是否意味着内核突然使用额外的500MB?

编辑:添加输出的cat proc/meminfo – 与运行的Java应用程序:

 MemTotal: 2097152 kB MemFree: 1112672 kB Buffers: 0 kB Cached: 0 kB SwapCached: 0 kB Active: 0 kB Inactive: 0 kB HighTotal: 0 kB HighFree: 0 kB LowTotal: 2097152 kB LowFree: 1112672 kB SwapTotal: 0 kB SwapFree: 0 kB Dirty: 0 kB Writeback: 0 kB AnonPages: 0 kB Mapped: 0 kB Slab: 0 kB PageTables: 0 kB NFS_Unstable: 0 kB Bounce: 0 kB CommitLimit: 0 kB Committed_AS: 0 kB VmallocTotal: 0 kB VmallocUsed: 0 kB VmallocChunk: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 Hugepagesize: 2048 kB 

top的“used”字段反映了正在使用的RAM的总量,包括进程,文件缓冲区和caching的总量。 但是RES编号只显示进程使用的RAM数量,不包括文件缓冲区。

要真正看到没有缓冲区的情况下使用了多lessRAM,可以使用free命令并查看-/+ buffers/cache行。 “used”列中的数字显示进程实际正在使用多lessRAM。

这是一个例子:

 $ free total used free shared buffers cached Mem: 2057196 1812352 244844 0 344768 833660 -/+ buffers/cache: 633924 1423272 Swap: 2097148 0 2097148 

这个输出显示系统有2GB的RAM,其中1.8GB正在使用。 但是,缓冲区使用344MB,caching使用833MB。 减去进程和内核只剩下633MB。

在启动Java应用程序之前和之后运行free命令,以更好地了解发生了什么事情。

编辑:删除对这些工具没有报告的内核内存的引用。

不要让caching和交换零,因为它是一个VPS主机。

I / Ocaching和交换可能由底层虚拟化主机处理,他们可能决定在客户端交换和cachingI / O,并设置性能等等,这可能是一件好事,因为这意味着你为您的进程获得2GB的RAN。 通常主机提供商工程师知道他们在做什么。

这也可能是因为你的VPS被监禁的方式(如果他们使用类似OpenVZ的东西),你可能不会看到所有耗尽内存的东西,但却是必需的让你的程序运行,并因此被计入你的配额。

如果你只是比较一下你的Java过程,那么你就没有得到全面的了解,因为你的应用程序可能会启动额外的进程,甚至是一堆进程。 那么多的内存不被考虑,tho,可能很容易成为Java应用程序的内存泄漏。 它产卵的过程和分配内存没有返回到正确的操作系统,最有可能的。

您的应用程序是否启动或使用任何本机进程? 它是否会产生其他进程或线程?