如何在Java中找到物理内存大小?

时间:2009-06-04 13:57:14

标签: java memory installer memory-management

我正在编写一个安装程序,它将调整产品的配置,以用于运行它的特定硬件。特别是,我想确定系统中安装了多少物理RAM,以便估计产品在运行时分配给内存的内存量。

理想情况下,我想以独立于平台的纯Java方式执行此操作,因为安装程序需要在多个不同的平台上运行,但如果无法实现,则首选Windows解决方案。最常见的部署平台。

在这种情况下,可以安全地假设产品将是盒子上运行的唯一/主要应用程序,因此我不必担心挤压其他人。我不想过度分配,因为根据我们的经验,这会影响性能。

7 个答案:

答案 0 :(得分:19)

您可以使用以下Java代码查询物理内存:

com.sun.management.OperatingSystemMXBean os = (com.sun.management.OperatingSystemMXBean)
     java.lang.management.ManagementFactory.getOperatingSystemMXBean();
long physicalMemorySize = os.getTotalPhysicalMemorySize();

但是包com.sun.management是可选的,无需在每个平台上都可用。

答案 1 :(得分:4)

如果您的目的是调整JVM的内存设置以使用所有可用的物理内存,而不是更多,那么您可以查看-XX:+ AggressiveHeap参数。

有了它,您无需知道可用内存。 JVM将自动扩展其参数。

答案 2 :(得分:4)

本地JMX和MBean怎么样?试试这个:

MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
Object attribute = mBeanServer.getAttribute(new ObjectName("java.lang","type","OperatingSystem"), "TotalPhysicalMemorySize");
System.out.println("Total memory: "+ attribute.toString() +" B");

您可以通过这种方式访问​​许多有用的信息。

答案 3 :(得分:3)

对于Windows,您需要访问WMI - 这将让您前进:Accessing Windows Management Instrumentation (WMI) from Java

您将要使用WMI的这一部分:Win32_LogicalMemoryConfiguration。

可能有一种纯粹的java方式,但我不知道它。

答案 4 :(得分:1)

在linux下,您可以使用sysinfo(2)。我不认为它实际上可能来自纯Java。

答案 5 :(得分:1)

import java.lang.management.ManagementFactory;

import javax.management.AttributeNotFoundException;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanException;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.ReflectionException;

public class Main {
  public static void main(String[] args) throws InstanceNotFoundException, AttributeNotFoundException, MalformedObjectNameException, ReflectionException, MBeanException  {
  /* Total number of processors or cores available to the JVM */


      MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
      Object attribute = mBeanServer.getAttribute(new ObjectName("java.lang","type","OperatingSystem"), "TotalPhysicalMemorySize");
      Object attribute2 = mBeanServer.getAttribute(new ObjectName("java.lang","type","OperatingSystem"), "FreePhysicalMemorySize");
      System.out.println("Total memory: "+ Long.parseLong(attribute.toString()) / 1024  +"MB");
      System.out.println("Free  memory: "+ Long.parseLong(attribute2.toString()) / 1024  +"MB");    

 }
}

答案 6 :(得分:0)

在过去的几年中,几次遇到这个问题。现有的大多数答案都是黑客和平台相关的,因此,今天没有适用于JAVA的独立,平台独立的工具集吗?

实际上,有一个:https://github.com/oshi/oshi

  

OSHI是Java的免费基于JNA的(本机)操作系统和硬件信息库。它不需要安装任何其他本机库,并且旨在提供一种跨平台的实现来检索系统信息,例如OS版本,进程,内存和CPU使用率,磁盘和分区,设备,传感器等。

是的,它确实像其他方法一样在内部使用了JNI,但是如果所有详细信息都仔细地隐藏在干净的API之后,并且如果您使用任何体面的现代依赖管理程序,该包都非常容易安装,谁会在乎呢?工具(Maven,Gradle等)。

对于任何严肃的项目,请使用此项目。不要重新发明轮子。