【问题标题】:Get available RAM in Java在 Java 中获取可用 RAM
【发布时间】: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 所说,如果这个要求有什么目的?

标签: java linux memory


【解决方案1】:

这段代码sn-p解决了问题。

public static long getAvailableMem()
{
    String osName = System.getProperty("os.name");
    if (osName.equals("Linux"))
    {
        try {
            BufferedReader memInfo = new BufferedReader(new FileReader("/proc/meminfo"));
            String line;
            while ((line = memInfo.readLine()) != null)
            {
                if (line.startsWith("MemAvailable: "))
                {
                    // Output is in KB which is close enough.
                    return java.lang.Long.parseLong(line.split("[^0-9]+")[1]) * 1024;
                }
            }
        } catch (IOException e)
        {
            e.printStackTrace();
        }
    // We can also add checks for freebsd and sunos which have different ways of getting available memory
    } else
    {
        OperatingSystemMXBean osBean = ManagementFactory.getOperatingSystemMXBean();
        com.sun.management.OperatingSystemMXBean sunOsBean = (com.sun.management.OperatingSystemMXBean)osBean;
        return sunOsBean.getFreePhysicalMemorySize();
    }
    return -1;
}

【讨论】:

    猜你喜欢
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    相关资源
    最近更新 更多