2017-02-14 6 views
1

Wir haben eine Wicket-Anwendung, die nicht mehr genügend Arbeitsspeicher. Ich bekomme folgenden Fehler.Auflösen von Speicherverlust in Wicket

java.lang.OutOfMemoryError: GC overhead limit exceeded 

Als ich Heapdump nahm, kann ich sehen, folgende

enter image description here

Mein Code wie unten aussieht.

Von was ich gelesen habe, serialisiert Wicket Instanz dieser Klasse und speichert in Sitzung. Ist es die Ursache für dieses Leck? Wie kann man das verhindern?

Antwort

1

Es sieht so aus, als ob die Wicket-Seiten nicht GC-ed sind und sie alle ihre Komponenten herum behalten.

Ich würde vorschlagen, dass Sie einen Heap-Dump machen und sehen, wie diese Referenzen im Classloader gehalten werden. Eclipse Memory Analyzer (http://www.eclipse.org/mat/) ist ein sehr gutes Werkzeug dafür. Ein anderes gutes Werkzeug ist Intellij IDEA Memory View (https://blog.jetbrains.com/idea/2016/08/jvm-debugger-memory-view-for-intellij-idea/).

+0

Wie Sie oben sehen können, habe ich jMat verwendet, um Heap Dump zu analysieren. "Wie diese Referenzen im Classloader aufbewahrt werden ..." Können Sie ein wenig ausarbeiten? Sie meinen, wer bezieht sich auf dieses Objekt? –

+0

Rechts. Sie müssen den Pfad vom Objekt zum Klassenlader finden. Auf diese Weise können Sie verstehen, warum sie nicht GC-ed sind. –