有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用Java获得可用空闲RAM的准确方法

我试图在一个使用Java的系统上获得可用的免费RAM(11,但更早的版本也不错)

有多种方法可以做到这一点,但没有一种是准确的

如各种其他帖子(以及Stackoverflow)所述:

/* Returns the maximum amount of memory available to 
   the Java Virtual Machine set by the '-mx' or '-Xmx' flags. */
Runtime.getRuntime().maxMemory();

/* Returns the total memory allocated from the system 
   (which can at most reach the maximum memory value 
   returned by the previous function). */
Runtime.getRuntime().totalMemory();

/* Returns the free memory *within* the total memory 
   returned by the previous function. */
Runtime.getRuntime().freeMemory();

但是在测试时,我经常得到0返回,因此有另一种方法可以使用OperatingSystemMXBeans:

long memorySize = ((com.sun.management.OperatingSystemMXBean)
    ManagementFactory.getOperatingSystemMXBean()).getTotalPhysicalMemorySize();
long freeMemorySize = ((com.sun.management.OperatingSystemMXBean)
    ManagementFactory.getOperatingSystemMXBean()).getFreePhysicalMemorySize();

这样做效果更好,但值并不准确,报告的可用性也远低于实际值

是否有一种标准的跨平台方法来获取Java中的全部可用RAM?我现在被难倒了


共 (2) 个答案

  1. # 2 楼答案

    {}中的{}etc方法报告的是VM的内存状态,而不是您的操作系统。把虚拟机想象成一台虚拟计算机。操作系统为JVM提供了大量内存,就操作系统而言,所有内存都在使用中。但是对于JVM本身来说,有些是免费的,有些是在使用中的

    因此,如果您想知道在操作系统级别有多少可用内存,那么这些方法是完全无用的

    记忆报告与其说是原始的硬数字,不如说是一种灰色的东西。这取决于“记忆”的含义。例如:

    系统有4GB RAM,并使用主磁盘进行交换,目前主磁盘有80GB的可用空间。占用了15GB的交换空间,使用了2GB的RAM

    “多少内存是空闲的”这个问题的答案是什么根据您对事物的定义,67GB、2GB和0GB都是有效答案。67GB的答案似乎是最没用的,但这是唯一真正稳定的答案(如果系统进行交换和物理RAM,即使系统上没有发生什么特别重大的事情(可能你alt+切换到另一个应用程序,或者某个应用程序在后台醒来),如果你使用2GB的测量,你会在免费内存中获得巨大的摆动

    我仍然过于简单化,因为通常一块内存是为更高身份验证级别的用户或内核本身保留的。假设1GB是为root和内核保留的,这样,如果系统负载过重,管理员仍然可以登录并管理系统,而不必为此烦恼。这算“免费”吗?它实际上是免费的内存,但如果你不是管理员,你就不能使用它

    在mac OS和iPhone上,某个应用程序会在系统需要更多资源的时候被通知随时可能被关闭,但除非实际需要这些资源,否则不会这样做:这样,如果你有一些刚刚运行的iPhone应用程序,但目前已不再运行(你回到跳板或让手机进入睡眠状态),系统会以两种方式快速运行:如果你拿起手机并启动该应用程序,它会立即启动。如果您拿起手机启动其他应用程序,系统会强制关闭该应用程序,回收内存,并将其用于您启动的新应用程序

    所以。。内存是否“空闲”?没有明确的方法来回答这个问题

    诸如此类

    也许先想想你为什么需要这些信息。现代计算不再有明确定义的“空闲RAM”概念,因此,需要了解表明模型存在问题