如何在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等)。
对于任何严肃的项目,请使用此项目。 不要重新发明轮子。