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

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

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

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

对于Windows,您需要访问WMI – 这将帮助您: 从Java访问Windows Management Instrumentation(WMI) 。

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

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

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

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

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

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

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

那么本地JMX和MBeans呢? 尝试这个:

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

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

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

过去几年曾多次遇到过这个问题。 大多数现有的答案都是黑客攻击和平台依赖,因此,今天JAVA没有任何独立的,独立于平台的工具集?

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

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

是的,它确实在内部使用JNI,就像其他方法一样,但如果所有细节都被小心地隐藏在一个干净的API背后,如果您使用任何体面的,现代的依赖管理工具(maven),那么包很容易安装,gradle等)。

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