20 Stimmen

Wie kann ich die Größe des physischen Speichers in Java ermitteln?

Ich schreibe ein Installationsprogramm, das die Konfiguration des Produkts auf die jeweilige Hardware, auf der es ausgeführt werden soll, abstimmt. Insbesondere möchte ich feststellen, wie viel physischer Arbeitsspeicher im System installiert ist, damit ich abschätzen kann, wie viel Arbeitsspeicher dem Produkt zugewiesen werden muss, wenn es ausgeführt wird.

Idealerweise würde ich dies gerne plattformunabhängig und in reinem Java tun, da das Installationsprogramm auf mehreren verschiedenen Plattformen laufen muss, aber falls dies nicht möglich ist, werden Lösungen für Windows bevorzugt, da dies die häufigste Einsatzplattform ist.

In diesem Fall kann man davon ausgehen, dass das Produkt die einzige/Hauptanwendung ist, die auf dem Rechner läuft, so dass ich mich nicht darum kümmern muss, andere Anwendungen zu verdrängen. Ich möchte nicht zu viel Speicherplatz zuweisen, da dies unserer Erfahrung nach die Leistung beeinträchtigen kann.

23voto

Horcrux7 Punkte 22751

Sie können den folgenden Java-Code verwenden, um den 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 ist optional und muss nicht auf jeder Plattform verfügbar sein.

6voto

Marek Podyma Punkte 723

Was ist mit lokalem 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");

Auf diese Weise können Sie viele nützliche Informationen abrufen.

4voto

Laurent Simon Punkte 572

Wenn Sie die Speichereinstellungen für die JVM so anpassen möchten, dass der gesamte verfügbare physische Speicher verwendet wird, aber nicht mehr, dann können Sie den Parameter -XX:+AggressiveHeap verwenden.

Sie brauchen den verfügbaren Speicherplatz nicht zu kennen. Die JVM wird ihre Parameter automatisch skalieren.

4voto

Nadir Fouka Punkte 422
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");    

 }
}

2voto

Nate Punkte 29413

Unter Windows müssen Sie auf WMI zugreifen - so können Sie loslegen: Zugriff auf Windows Management Instrumentation (WMI) von Java aus .

Sie werden diesen Abschnitt von WMI verwenden wollen: Win32_LogicalMemoryConfiguration.

Vielleicht gibt es eine reine Java-Methode, aber ich kenne sie nicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X