Letztendlich haben Sie immer eine begrenzte Anzahl von Heaps, die Sie verwenden können, egal auf welcher Plattform Sie arbeiten. Unter Windows 32 Bit ist dies etwa 2GB
(nicht speziell Heap, sondern Gesamtspeichermenge pro Prozess). Es ist nur so, dass Java sich dafür entschieden hat, den Standardwert kleiner zu machen (vermutlich, damit der Programmierer keine Programme erstellen kann, die eine unkontrollierte Speicherzuweisung haben, ohne auf dieses Problem zu stoßen und genau untersuchen zu müssen, was sie tun).
Es gibt also mehrere Möglichkeiten, den benötigten Speicherplatz zu ermitteln oder den verwendeten Speicherplatz zu reduzieren. Ein häufiger Fehler bei Garbage-Collecting-Sprachen wie Java oder C# besteht darin, Verweise auf Objekte zu behalten, die Sie nicht mehr verwenden, oder viele Objekte zuweisen, wenn man sie auch Wiederverwendung sie stattdessen. Solange Objekte einen Verweis auf sie haben, werden sie weiterhin Heap-Speicherplatz verwenden, da der Garbage Collector sie nicht löschen wird.
In diesem Fall können Sie einen Java-Speicher-Profiler verwenden, um festzustellen, welche Methoden in Ihrem Programm eine große Anzahl von Objekten zuweisen, und dann feststellen, ob es eine Möglichkeit gibt, dafür zu sorgen, dass sie nicht mehr referenziert werden, oder sie gar nicht erst zuzuweisen. Eine Möglichkeit, die ich in der Vergangenheit verwendet habe, ist "JMP" http://www.khelekore.org/jmp/ .
Wenn Sie feststellen, dass Sie diese Objekte aus einem bestimmten Grund zuweisen und Referenzen behalten müssen (je nachdem, was Sie tun, könnte dies der Fall sein), müssen Sie nur die maximale Heap-Größe erhöhen, wenn Sie das Programm starten. Sobald Sie jedoch ein Speicherprofil erstellt haben und verstehen, wie Ihre Objekte zugewiesen werden, sollten Sie eine bessere Vorstellung davon haben, wie viel Speicher Sie benötigen.
Wenn Sie nicht garantieren können, dass Ihr Programm in einer endlichen Menge an Speicher läuft (vielleicht abhängig von der Größe der Eingabe), werden Sie immer auf dieses Problem stoßen. Erst wenn Sie all diese Möglichkeiten ausgeschöpft haben, müssen Sie sich mit der Zwischenspeicherung von Objekten auf der Festplatte usw. befassen. An diesem Punkt sollten Sie einen sehr guten Grund haben, um zu sagen: "Ich brauche Xgb Speicher" für etwas und Sie können das Problem nicht umgehen, indem Sie Ihre Algorithmen oder Speicherzuweisungsmuster verbessern. Im Allgemeinen ist dies nur bei Algorithmen der Fall, die mit großen Datenmengen arbeiten (z. B. eine Datenbank oder ein wissenschaftliches Analyseprogramm), und dann werden Techniken wie Caching und Memory Mapped IO nützlich.