2017-08-23 1 views
0

Ich arbeite an der digitalen Bildverarbeitung. Wenn ich Bilder mit höherer Auflösung mit hoher Auslastung ausprobiere, bekomme ich viele OOM-Probleme.Können wir Full GC manuell oder mit Parameter bei einigen Prozent des Heap auslösen, ist das suggestible

Ich verwende diese Startparameter mit Anwendung

-Xms10240m -Xmx10240m -XX:NewRatio=3 -XX:+PrintFlagsFinal -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 

Ich kann nicht erschwinglich Heap-Speicher zu erhöhen.

Also, kann ich Full manuell bei einigen Prozent der Heap auslösen, wenn möglich. laufendes Handbuch ist suggestible Operation ??

+3

Ein Garbage Collect hilft Ihnen nicht mit einem OOM .. – NickL

+3

GC ist immer fertig, bevor ein 'OOM' geworfen wird, so dass Sie einfach nicht genug Speicher haben. Erhalten Sie mehr Arbeitsspeicher oder ändern Sie Ihr Programm, um weniger Arbeitsspeicher zu verwenden. – Kayaman

Antwort

1

Sie können eine Anforderung an die JVM senden, GC über einen Aufruf von System.gc() auszulösen. Die API-Dokumentation sagt, dass dies "darauf hindeutet, dass die Java Virtual Machine Aufwand für die Wiederverwendung ungenutzter Objekte aufwendet". Wenn Sie die HotSpot JVM von Oracle verwenden, wird bei jedem Anruf ein vollständiger GC ausgeführt.

Dies ist jedoch unwahrscheinlich (wie in den Kommentaren gesagt wurde), um Ihr Problem zu lösen. Der GC ist sehr gut darin, Speicherplatz zurückzugewinnen, der nicht mehr benötigt wird, so dass die OOM-Ausnahme, die Sie erhalten, höchstwahrscheinlich darauf zurückzuführen ist, dass Sie nur 1 GB Speicher für Ihren Heapspeicher haben. Wie groß sind Ihre Bilder und wie viele versuchen Sie gleichzeitig zu verarbeiten? Sie sollten in der Lage sein, einige einfache Berechnungen durchzuführen, um die erforderliche Mindestgröße für den Heap zu ermitteln.

Sie haben die folgenden zwei Argumente:

-XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=80 

Das bedeutet, die JVM zu warten, bis der Haufen zu 80% voll ist, bevor die gleichzeitige Kollektor zu initiieren. Versuchen Sie, dies zu verringern. Keine Garantien, aber es kann Dinge verbessern.

Verwandte Themen