Ich habe eine JAR-Datei, die auf einer amazon-ec2-m1.large-Instanz mit einem Linux-64-Bit-Betriebssystem läuft. Ich habe nach verschiedenen Stunden keinen Speicher mehr, normalerweise zwischen 2-4, obwohl ich in meinem letzten Protokoll schreiben (vor der Fehlerdatei erstellt) sehe Folgendes:
%Vor%Wenn ich vom Start des Jars aus schaue, bis der Speicher voll ist - alle Werte sind gleich und die freeHeapSize liegt zwischen 200-230 MB (ich überprüfe alle 30 Sekunden und mache System.gc ())
in der Datei hs_err_pid2250.log wrriten:
%Vor%Außerdem verwende ich threadpoolexecutor mit 30 Kernfäden und 100 Max (nie Benutzer mehr als 30, obwohl ich manchmal alle 30 benutze)
Endlich, ich benutze den bonecp-Verbindungspool mit 50 Verbindungen
Irgendwelche Vorschläge? :)
Nach dem Vorschlag habe ich einen Heap-Dump nach dem Ausführen der Anwendung von meinem lokalen PC hinzugefügt. Wie kann ich von hier weitermachen? Sind die kritischen orangen Sprünge wichtig? Oder sind nur die verwendeten wichtig?
Ich konnte einen fast identischen Fehler beheben, indem ich den folgenden Ratschlägen folgte:
Im Wesentlichen geben sie an:
Wenn die Java Virtual Machine startet, erzeugt sie standardmäßig eine Reihe von Garbage Collection (GC) -Threads, die für parallele GC-Operationen verwendet werden ... die Anzahl solcher Threads wird nach folgender Formel berechnet: (ncpus & lt; = 8) ? ncpus: 3 + ((ncpus * 5) / 8) ... Wegen der Erstellung dieser vielen Threads ... wird das Programm automatisch die Systemgrenze erreichen ...
Ich beschränkte die Anzahl der Garbage Collection-Threads mit der Umgebungsvariablen wie folgt:
%Vor%Ich bin mir nicht sicher über den allgemeinen Leistungseinbruch bezüglich GC, aber zumindest ist die heutige Arbeit erledigt.
Bitte überprüfen Sie den ursprünglichen Post für weitere Optionen.
Viel Glück, - Stu
Wenn Sie mehr physischen RAM zur Verfügung haben, verwenden Sie das. Es scheint, dass die zugewiesene Heap-Größe nur 1656 mb ist, was vielleicht nicht genug ist. Versuchen Sie, eine Java-Jar-Datei mit zwei Switches -xmx4096mb und -xms 2048 auszuführen Überwachen Sie dann die Verwendung, vielleicht ist der Speicherbedarf zu groß für Ihre Anwendung, wenn Sie nach einiger Zeit immer noch nicht genügend Arbeitsspeicher haben, dann müssen weitere Untersuchungen durchgeführt werden, um zu überprüfen, ob der Code Speicher verliert. Hoffe, das hilft, lass es mich wissen, wenn du mehr Klarheit brauchst.
Heap ist nur ein Teil der Gleichung. Sehen Sie sich den gesamten residenten Speicher an - er enthält Heap- und Off-Heap-Beiträge. Off-Heap enthält gemappte JARs, Thread-Stacks (~ 1MB pro Thread), Perm-Gen, etc. SO hat eine Reihe von Fragen, wie man es unter Linux macht.
Ohne zu versuchen, die Speicherauszugsdaten zu dekodieren, werde ich feststellen, dass es im Grunde drei Fälle gibt, in denen eine JVM nicht genügend Arbeitsspeicher hat:
Irgendwie dazwischen wären Klassen. Wenn Sie eine App ausführen, die Klassen dynamisch erstellt und lädt, müssen Sie einzelne Klassenladeprogramme ordnungsgemäß verwenden, um die Klassen zu sammeln.
Tags und Links java memory memory-management