【发布时间】:2020-04-22 04:42:33
【问题描述】:
我正在尝试获取 Java 应用程序中系统的可用 RAM 量,特别是在 Linux 上,但它需要是跨平台的。不是 JVM 可用的内存量,而是可用的实际物理 RAM。也不是可用的 RAM,我的意思是可用的。
我尝试使用 OperatingSystemMXBean,但它只返回空闲 RAM:当然问题是 Linux 会消耗空闲 RAM 作为磁盘缓存以加速系统,即使内核将“空闲”数量减少到几乎为零如果需要更多 RAM,将随时转储该缓存,因此需要“可用”值。
所以大约一周后,我的应用程序会开始抱怨我的系统几乎没有 RAM,我会这样看:“不,系统可能只有 100MB 的可用 RAM,但它有 3GB 的磁盘缓存它可以根据需要释放”。
即使是“已使用”的内存也比免费的更有用。我读到的关于“使用”RAM 的每个教程都说要使用“完全免费”:不是一回事。 Total - Used != 也可用,但它比“免费”更接近,并且可以提供更准确的跟踪。
我觉得我必须错过一些东西。在大多数情况下,“可用”RAM 并不是一个非常有用的指标;每当有人说他们想要“免费” RAM 时,他们几乎总是意味着“可用”,即应用程序可以使用多少 RAM。我很确定它们在 Windows 上是一样的,但在 *nix 中,“免费”和“可用”之间的区别非常重要,这似乎是 Oracle/Sun 方面的重大疏忽。
【问题讨论】:
-
操作系统向您承诺一定的虚拟内存配额(也许......),您通常可以找出您的语言环境当前分配了多少。系统范围的“可用内存”不是一个有用的指标,因为它严格受操作系统的控制,它总是将它用于一些目的,可能是也可能不是“进程内存”。随着对该资源的各种需求随着时间的推移而起起落落,操作系统也会做出相应的反应。但它对您的应用程序保持着承诺:在您的配额(如果有的话)内,您将获得您要求的 [虚拟] 内存。
-
我不是要获取 JVM 的内存量,我想要的是系统内存量。
-
为什么需要知道它?你的程序不应该关心内存。要么有足够的内存供程序使用,要么没有。您花在这方面的所有时间都将被浪费,因为没有合适的 Java 程序在尝试完成其实际目的时尝试管理内存。
-
我认为没有办法做到这一点,但正如@Kayaman 所说,如果这个要求有什么目的?