2009-06-04 19 views
15

Estoy escribiendo un instalador que ajustará la configuración del producto para el hardware en particular en el que se ejecutará. En particular, quiero determinar cuánta RAM física está instalada en el sistema para poder estimar cuánta memoria asignar al producto cuando se ejecuta.¿Cómo puedo encontrar el tamaño de la memoria física en Java?

Idealmente, me gustaría hacer esto de una manera Java pura, independiente de la plataforma, ya que el instalador deberá ejecutarse en varias plataformas diferentes, pero en caso de que esto no sea posible, se preferirán las soluciones para Windows como esa es la plataforma de implementación más común.

En este caso, es seguro asumir que el producto será la única/principal aplicación que se ejecuta en la caja, por lo que no tengo que preocuparme de exprimir a nadie más. No quiero asignar demasiado, ya que, según nuestra experiencia, puede perjudicar el rendimiento.

+0

Si su instalador está en Java, solo funcionará si se ha instalado el JRE ... – Nate

+0

Gracias. En este caso, el JRE es uno de los requisitos enumerados del software, por lo que podemos suponer está ahí :) –

+0

incluso vía JMX no es posible – dfa

Respuesta

3

Para Windows, tendrá que acceder a WMI - esto lo pondrá en marcha: Accessing Windows Management Instrumentation (WMI) from Java.

Querrá utilizar esta sección de WMI: Win32_LogicalMemoryConfiguration.

Puede haber una forma pura de Java de hacer esto, pero no lo conozco.

+0

¡Gracias! Parece que esa clase no está soportada en XP & Server 2003, y no está disponible en Vista en adelante (http://msdn.microsoft.com/en-us/library/aa394181(VS.85).aspx). Aparentemente Win32_OperatingSystem es su reemplazo. –

+0

Sí, las diferentes versiones de Windows admiten diferentes clases de WMI. Tendrá que ajustar en función de su sistema operativo objetivo. – Nate

1

En Linux puede usar sysinfo(2). No creo que sea realmente posible de Java puro.

+0

¡Salud! ¿Probablemente tendré que llamar a eso a través de JNI? –

+0

Sí, ese es el syscall de C. Desde una línea de comando puede analizar los resultados de forma gratuita (1), estoy bastante seguro de que hay una forma aún mejor, pero no puedo pensar en una ahora. Posiblemente podría poner todo esto en un script o paquete de shell que los usuarios usen para instalar su aplicación también, en lugar de usar jni. – wds

4

Si su intención es ajustar la configuración de la memoria para que la JVM use toda la memoria física disponible, pero no más, entonces puede echarle un vistazo al parámetro -XX: + AggressiveHeap.

Con él, no necesita conocer la memoria disponible. La JVM escalará sus parámetros automáticamente.

17

Usted puede utilizar el siguiente código Java para consultar la memoria física:

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

Pero el paquete com.sun.management es opcional y no necesita estar disponible en todas las plataformas.

+1

en mi humilde opinión, esta es, de lejos, la mejor respuesta. trabajó en Linux y en Windows. no es necesario un tratamiento especial con WMI para Windows ... –

+2

Tenga en cuenta que al usar una JVM de 32 bits, esto nunca devolverá más de 4 GB. – berry120

+0

Gracias, bien. Esto es lo que necesitaba. Iba a crear una solución C++ y llamarla desde mi programa Java. –

3

¿Qué pasa con JMX local y MBeans? Pruebe esto:

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

Puede acceder a mucha información útil de esta manera.

Cuestiones relacionadas