我想在Java应用程序中获取系统可用RAM的数量,特别是在Linux上,但需要跨平台。 不是可用于JVM的内存量,而是实际可用的物理RAM。 不是空闲RAM,我指的是可用RAM。
我尝试使用OperatingSystemMXBean,但它只返回免费RAM:当然,问题是Linux将消耗免费RAM作为磁盘缓存以加快系统速度,将“免费”金额减少到几乎为零,即使内核随时会转储该缓存如果需要更多RAM,因此需要一个“可用”值。
因此,大约一周后,我的应用程序将开始抱怨我的系统几乎没有RAM,我看着它说“不,系统可能只有100MB的RAM可用,但它有3GB的磁盘缓存可以随时释放”。
即使“已使用”的内存也比空闲内存更有用。 我阅读的有关获取“已使用”RAM的每个教程都说要使用“总计- 免费”:这不是同一件事。 总数 - 已使用!=可用,但比“免费”更接近,并且可以提供更准确的跟踪。
我觉得我肯定错过了什么。“自由”RAM在大多数情况下并不是非常有用的指标; 每当有人说他们想要“自由”RAM时,他们几乎总是指“可用”,即应用程序可以使用多少RAM。 我相当确定它们在Windows上是相同的,但在*nix中,“空闲”和“可用”之间的区别非常重要,似乎是Oracle / Sun的一个重大疏忽。
我尝试使用OperatingSystemMXBean,但它只返回免费RAM:当然,问题是Linux将消耗免费RAM作为磁盘缓存以加快系统速度,将“免费”金额减少到几乎为零,即使内核随时会转储该缓存如果需要更多RAM,因此需要一个“可用”值。
因此,大约一周后,我的应用程序将开始抱怨我的系统几乎没有RAM,我看着它说“不,系统可能只有100MB的RAM可用,但它有3GB的磁盘缓存可以随时释放”。
即使“已使用”的内存也比空闲内存更有用。 我阅读的有关获取“已使用”RAM的每个教程都说要使用“总计- 免费”:这不是同一件事。 总数 - 已使用!=可用,但比“免费”更接近,并且可以提供更准确的跟踪。
我觉得我肯定错过了什么。“自由”RAM在大多数情况下并不是非常有用的指标; 每当有人说他们想要“自由”RAM时,他们几乎总是指“可用”,即应用程序可以使用多少RAM。 我相当确定它们在Windows上是相同的,但在*nix中,“空闲”和“可用”之间的区别非常重要,似乎是Oracle / Sun的一个重大疏忽。