2009-06-04 7 views
15

Ich schreibe ein Installationsprogramm, das die Konfiguration des Produkts für die bestimmte Hardware abstimmt, auf der es ausgeführt wird. Insbesondere möchte ich feststellen, wie viel physikalischer RAM im System installiert ist, damit ich abschätzen kann, wie viel Speicher dem Produkt bei der Ausführung zugewiesen werden muss.Wie finde ich die physische Speichergröße in Java?

Idealerweise möchte ich dies in einer plattformunabhängigen, reinen Java-Umgebung tun, da das Installationsprogramm auf verschiedenen Plattformen ausgeführt werden muss, aber falls dies nicht möglich ist, werden Lösungen für Windows bevorzugt das ist die am häufigsten verwendete Bereitstellungsplattform.

In diesem Fall kann davon ausgegangen werden, dass das Produkt die einzige/wichtigste Anwendung ist, die auf der Box ausgeführt wird, sodass ich keine Angst haben muss, andere auszuquetschen. Ich möchte nicht überzuordnen, da dies nach unserer Erfahrung Leistung beeinträchtigen kann.

+0

Wenn Ihr Installer in Java ist - wird es nur funktionieren, wenn die JRE installiert wurde ... – Nate

+0

Danke - in diesem Fall ist die JRE eine der aufgeführten Anforderungen der Software, so dass wir davon ausgehen dürfen es ist da :) –

+0

sogar über JMX ist nicht möglich – dfa

Antwort

3

Für Windows müssen Sie auf WMI zugreifen - das wird Sie in Gang bringen: Accessing Windows Management Instrumentation (WMI) from Java.

Sie möchten diesen Abschnitt von WMI verwenden: Win32_LogicalMemoryConfiguration.

Es mag einen reinen Java-Weg geben, aber ich bin mir dessen nicht bewusst.

+0

Danke! Diese Klasse wird in XP & Server 2003 nicht unterstützt und ist ab Vista nicht mehr verfügbar (http://msdn.microsoft.com/en-us/library/aa394181(VS.85).aspx). Anscheinend ist Win32_OperatingSystem sein Ersatz. –

+0

Ja verschiedene Windows-Versionen unterstützen verschiedene WMI-Klassen. Sie müssen basierend auf Ihrem Zielbetriebssystem Anpassungen vornehmen. – Nate

1

Unter Linux können Sie sysinfo(2) verwenden. Ich glaube nicht, dass es tatsächlich aus reinem Java möglich ist.

+0

Prost - vermutlich müsste ich das über JNI anrufen? –

+0

Ja, das ist der C-Syscall. Von einer cmdline können Sie die Ergebnisse von free (1) analysieren, ich bin mir ziemlich sicher, dass es einen noch besseren Weg gibt, aber ich kann mir momentan keinen vorstellen. Sie könnten das Ganze auch in ein Shell-Skript oder -Paket einfügen, mit dem Benutzer Ihre Anwendung installieren, anstatt jni zu verwenden. – wds

4

Wenn Sie die Speichereinstellungen für die JVM optimieren möchten, um den gesamten verfügbaren physischen Speicher zu verwenden, aber nicht mehr, dann können Sie sich den Parameter -XX: + AggressiveHeap ansehen.

Damit müssen Sie den verfügbaren Speicher nicht kennen. Die JVM wird ihre Parameter automatisch skalieren.

17

Sie können den folgenden Java-Code verwenden, um die physischen Speicher abzufragen:

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

Aber das Paket com.sun.management optional und müssen nicht auf jeder Plattform verfügbar sein.

+1

IMHO, das ist bei weitem die beste Antwort. arbeitete sowohl auf Linux als auch auf Windows. Keine Notwendigkeit für eine spezielle Behandlung mit WMI für Windows ... –

+2

Beachten Sie, dass bei Verwendung einer 32-Bit-JVM niemals mehr als 4 GB zurückgegeben werden. – berry120

+0

Danke, gut. Das habe ich gebraucht. Ich wollte C++ Workaround erstellen und es aus meinem Java-Programm aufrufen. –

3

Was ist mit lokalen JMX und MBeans? Versuchen Sie dies:

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

Sie können auf diese Weise viele nützliche Informationen zugreifen.

Verwandte Themen