Dieses Beispiel von William Brendel kann von Nutzen sein.
BEARBEITEN: Ich habe dieses Beispiel ursprünglich bereitgestellt (Link zu William Brendels Antwort zu einem anderen Thema). Der Ersteller dieses Themas (Steve M) wollte eine plattformübergreifende Java-Anwendung erstellen. Insbesondere versuchte der Benutzer, ein Mittel zu finden, mit dem die Ressourcen des laufenden Computers (Speicherplatz, CPU- und Speichernutzung) bewertet werden können.
Dies ist eine Inline-Abschrift der Antwort in diesem Thema. Zu diesem Thema wurde jedoch darauf hingewiesen, dass dies nicht die ideale Lösung ist, obwohl meine Antwort als akzeptiert markiert ist.
public class Main {
public static void main(String[] args) {
System.out.println("Available processors (cores): " +
Runtime.getRuntime().availableProcessors());
System.out.println("Free memory (bytes): " +
Runtime.getRuntime().freeMemory());
long maxMemory = Runtime.getRuntime().maxMemory();
System.out.println("Maximum memory (bytes): " +
(maxMemory == Long.MAX_VALUE ? "no limit" : maxMemory));
System.out.println("Total memory (bytes): " +
Runtime.getRuntime().totalMemory());
File[] roots = File.listRoots();
for (File root : roots) {
System.out.println("File system root: " + root.getAbsolutePath());
System.out.println("Total space (bytes): " + root.getTotalSpace());
System.out.println("Free space (bytes): " + root.getFreeSpace());
System.out.println("Usable space (bytes): " + root.getUsableSpace());
}
}
}
Benutzer Christian Fries weist darauf hin, dass es falsch ist anzunehmen, dass Runtime.getRuntime().freeMemory()
Sie die Menge an Speicher erhalten, die zugewiesen werden kann, bis ein Fehler aufgrund von Speichermangel auftritt.
Aus der Dokumentation geht hervor , dass die Unterschrift Runtime.getRuntime().freeMemory()
als solche zurückgegeben wird:
Rückgabe: Eine Annäherung an die derzeit für zukünftige zugewiesene Objekte verfügbare Gesamtmenge an Speicher, gemessen in Byte.
Benutzer Christian Fries behauptet jedoch, dass diese Funktion möglicherweise falsch interpretiert wird. Er behauptet, dass die ungefähre Speichermenge, die zugewiesen werden kann, bis ein Fehler aufgrund von Speichermangel auftritt (der freie Speicher), wahrscheinlich gegeben ist durch:
long presumableFreeMemory = Runtime.getRuntime().maxMemory() - allocatedMemory;
Mit allocatedMemory
gegeben von:
long allocatedMemory =
(Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory());
Der Schlüssel hier ist eine Diskrepanz zwischen dem Konzept des freien Speichers. Eine Sache ist der Speicher, den das Betriebssystem der Java Virtual Machine zur Verfügung stellt. Eine andere ist die Gesamtmenge an Bytes, die die Blöcke von Speicherblöcken umfasst, die tatsächlich von der Java Virtual Machine selbst verwendet werden.
In Anbetracht der Tatsache, dass der für Java-Anwendungen bereitgestellte Speicher von der Java Virtual Machine in Blöcken verwaltet wird, stimmt die für die Java Virtual Machine verfügbare Menge an freiem Speicher möglicherweise nicht genau mit dem für eine Java-Anwendung verfügbaren Speicher überein.
Insbesondere bezeichnet Christian Fries die Verwendung der Flags -mx
oder -Xmx
, um die maximale Speichermenge festzulegen, die für die Java Virtual Machine verfügbar ist. Er stellt folgende Funktionsunterschiede fest:
Runtime.getRuntime().maxMemory();
Runtime.getRuntime().totalMemory();
Runtime.getRuntime().freeMemory();
Christian schließt seine Antwort mit der Feststellung, dass Runtime.getRuntime().freeMemory()
tatsächlich das zurückgegeben wird, was man als vermutliches freies Gedächtnis bezeichnen kann; Selbst wenn eine zukünftige Speicherzuweisung den von dieser Funktion zurückgegebenen Wert nicht überschreitet, java.lang.OutOfMemoryError
kann möglicherweise noch ein vom Hostsystem zugewiesener Speicherblock erzeugt werden, wenn die Java Virtual Machine noch nicht den tatsächlichen vom Hostsystem zugewiesenen Speicherblock empfangen hat .
Letztendlich hängt die richtige Methode in unterschiedlichem Maße von den Besonderheiten Ihrer Anwendung ab.
Ich biete einen weiteren Link an, der nützlich sein kann. Diese Frage wurde vom Benutzer Richard Dormand gestellt und von stone333 zur Bestimmung der verwendeten Standard-Java-Heap-Größe beantwortet .