我正在编写一个安装程序,它将调整产品的配置,以用于运行它的特定硬件。特别是,我想确定系统中安装了多少物理RAM,以便估计产品在运行时分配给内存的内存量。
理想情况下,我想以独立于平台的纯Java方式执行此操作,因为安装程序需要在多个不同的平台上运行,但如果无法实现,则首选Windows解决方案。最常见的部署平台。
在这种情况下,可以安全地假设产品将是盒子上运行的唯一/主要应用程序,因此我不必担心挤压其他人。我不想过度分配,因为根据我们的经验,这会影响性能。
答案 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等)。
对于任何严肃的项目,请使用此项目。不要重新发明轮子。