Java 计算机中的可用内存

Java 计算机中的可用内存,java,memory,memory-management,Java,Memory,Memory Management,有什么方法可以让我在使用Java的机器中找到可用或空闲的ram吗 需要此详细信息,以便我可以相应地启动JVM。有,但它不是Java8中官方API的一部分,依赖于jdk 11中的可选模块jdk.management 您可以使用动态访问来避免对非官方API的直接代码依赖。在常见的实现(即OpenJDK和Oracle的JDK发行版)中,它将提供: import java.lang.management.ManagementFactory; import javax.management.*; pub

有什么方法可以让我在使用Java的机器中找到可用或空闲的ram吗

需要此详细信息,以便我可以相应地启动JVM。

有,但它不是Java8中官方API的一部分,依赖于jdk 11中的可选模块
jdk.management

您可以使用动态访问来避免对非官方API的直接代码依赖。在常见的实现(即OpenJDK和Oracle的JDK发行版)中,它将提供:

import java.lang.management.ManagementFactory;
import javax.management.*;

public class Memory {
    public static void main(String[] args) throws JMException {
        MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
        ObjectName objectName = new ObjectName("java.lang:type=OperatingSystem");

        Long free = (Long)mBeanServer.getAttribute(objectName, "FreePhysicalMemorySize");
        Long total= (Long)mBeanServer.getAttribute(objectName, "TotalPhysicalMemorySize");

        final double gb = 0x1p-30;

        System.out.printf("%.2f GB of %.2f GB free%n", free * gb, total * gb);

        total = (Long)mBeanServer.getAttribute(objectName, "TotalSwapSpaceSize");
        free  = (Long)mBeanServer.getAttribute(objectName, "FreeSwapSpaceSize");

        System.out.printf("%.2f GB of %.2f GB swap free%n", free * gb, total * gb);
    }
}
有,但它不是Java8中官方API的一部分,它依赖于JDK11中的可选模块,
jdk.management

您可以使用动态访问来避免对非官方API的直接代码依赖。在常见的实现(即OpenJDK和Oracle的JDK发行版)中,它将提供:

import java.lang.management.ManagementFactory;
import javax.management.*;

public class Memory {
    public static void main(String[] args) throws JMException {
        MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
        ObjectName objectName = new ObjectName("java.lang:type=OperatingSystem");

        Long free = (Long)mBeanServer.getAttribute(objectName, "FreePhysicalMemorySize");
        Long total= (Long)mBeanServer.getAttribute(objectName, "TotalPhysicalMemorySize");

        final double gb = 0x1p-30;

        System.out.printf("%.2f GB of %.2f GB free%n", free * gb, total * gb);

        total = (Long)mBeanServer.getAttribute(objectName, "TotalSwapSpaceSize");
        free  = (Long)mBeanServer.getAttribute(objectName, "FreeSwapSpaceSize");

        System.out.printf("%.2f GB of %.2f GB swap free%n", free * gb, total * gb);
    }
}

. 您可以尝试一些特定于操作系统的方法(比如在linux上读取
free
的输出)。@FedericoklezCulloca,假设我的JVM程序的最大大小为2GB。我是否可以事先检查我的JVM是否能够使用机器中至少2GB的可用内存?如果它不可用,我就不会启动JVM。我们的问题是矛盾的。当您希望“相应地启动我的JVM”时,“使用Java”获取可用RAM没有帮助。要“使用Java”获取可用RAM,即执行Java代码,您需要一个已经运行的JVM,这与在JVM运行之前指定这些数字的目的相矛盾。当“JVM将在RAM中启动”意味着有两个JVM时,好吧,这可以工作,但肯定既不简单也不高效。无论如何,这是可能的,但解决方案取决于Java版本。你用哪个版本?。您可以尝试一些特定于操作系统的方法(比如在linux上读取
free
的输出)。@FedericoklezCulloca,假设我的JVM程序的最大大小为2GB。我是否可以事先检查我的JVM是否能够使用机器中至少2GB的可用内存?如果它不可用,我就不会启动JVM。我们的问题是矛盾的。当您希望“相应地启动我的JVM”时,“使用Java”获取可用RAM没有帮助。要“使用Java”获取可用RAM,即执行Java代码,您需要一个已经运行的JVM,这与在JVM运行之前指定这些数字的目的相矛盾。当“JVM将在RAM中启动”意味着有两个JVM时,好吧,这可以工作,但肯定既不简单也不高效。无论如何,这是可能的,但解决方案取决于Java版本。你使用哪个版本?是静态的吗?“java.lang:type=OperatingSystem”是一个。当我写下答案时,我忘记了这些字符串也有相应的命名常量可以使用。因此,除了
“java.lang:type=OperatingSystem”
,您还可以编写
ManagementFactory.OPERATING\u SYSTEM\u MXBEAN\u NAME
。使用linux命令free-h使用java代码获得空闲ram是否是一种好的做法?在linux中初始化JVM时,这更像是一个…是静态的吗?“java.lang:type=OperatingSystem”是一个。当我写下答案时,我忘记了这些字符串也有相应的命名常量可以使用。因此,除了
“java.lang:type=OperatingSystem”
,您还可以编写
ManagementFactory.OPERATING\u SYSTEM\u MXBEAN\u NAME
。使用linux命令free-h使用java代码获得空闲ram是否是一种好的做法?在linux中初始化JVM的情况下。这将更像是一个…