2009-11-20 4 views
6

Beim Laden aller Komponententests in einem Paket löst die make-Task einen java.lang.OutOfMemoryError: Java-Heapspeicherfehler aus.JUnit java.lang.OutOfMemoryError beim Ausführen aller Tests in einem Paket

Wenn ich alle Tests in jedem Unterpaket ausführen, laden und vervollständigen alle Tests jedoch einwandfrei. Nur wenn ich versuche, alle Tests im übergeordneten Paket auszuführen, tritt der OOM-Fehler auf.

Ich glaube nicht, dass dieses Problem gelöst werden sollte, indem VM-Parameter optimiert werden. Ich habe versucht, die maximale Heap- und Perm-Größe zu erhöhen, und es hat das Problem nicht gelöst.

Das führt mich zu der Annahme, dass es zwischen den Ladeversuchen in verschiedenen Paketen Probleme beim Sammeln von Daten gibt, oder dass ein zu eifriges Laden der Klassen stattfindet.

Gibt es eine JUnit-Einstellung, die diese Probleme beheben kann, oder muss das Problem durch Ändern oder Hinzufügen von Code in den Testfällen gelöst werden?

+0

Sind Sie sicher, dass Sie keinen signifikanten Speicherverbrauch in der Statik Ihrer Testklassen oder in der Statik haben, die von Ihren Testklassen erreicht werden? – bmargulies

+1

Wie haben Sie die VM-Parameter optimiert? Versuchen Sie zu bestätigen, dass sie von den Methoden in java.lang.Runtime richtig eingestellt wurden. – Bozho

+0

Ich bin mir nicht sicher über den Speicherverbrauch der Statik, aber ich werde mich definitiv darum kümmern. Wie für die VM-Parameter habe ich versucht, diese: -Xmx512m -XX: PermSize = 128m -XX: MaxPermSize = 512m aber Erhöhung sie nicht helfen, den OOM-Fehler zu lösen. –

Antwort

3

Der GC wird ausgeführt, wenn die CPU freie Zeit hat oder der freie Speicher niedrig ist. Wenn Ihre Tests abstürzen, haben Sie möglicherweise irgendwo ein Speicherleck. (Ja, sie existieren auch in Java)

Werfen Sie einen Blick auf zirkuläre Referenzen und statische Klassen/Variablen.Diese sind IIRC häufige Gründe für Speicherlecks. Sie sollten sich auch die jconsole ansehen.

9

Sie müssen alle Felder der Testklassen auf null in tearDown() setzen. Der Grund ist, dass JUnit eine Instanz der Testklasse pro Test instanziiert. Es behält diese Instanz für die ganze Zeit bei, um die Ergebnisse des Tests zu speichern (Erfolg, Fehler, Stack-Trace). Wenn Sie also Felder verwenden, bleiben sie erhalten und Sie haben keinen Speicher mehr.

+0

Cool, ich werde dieses Update zuerst testen. –

+0

Leider hat dies das Problem nicht gelöst. wird tearDown() erst aufgerufen, nachdem alle Klassen geladen wurden und Tests beginnen zu laufen? Der OOM-Fehler, den ich sehe, passiert während der Make-Aufgabe, bevor die Tests überhaupt gestartet werden. –

+0

Nein, tearDown wird nach jedem einzelnen Test aufgerufen. Aber ich habe "in der Make-Aufgabe" verpasst. Von welcher Aufgabe sprichst du? Benutzt du Ant? Oder GNU Make? –

4

Ich hatte ein ähnliches Problem mit TestNG und verfolgte es auf die Menge der Protokollinformationen, die ich auf der Konsole erzeugte. Sobald ich dies reduziert hatte, konnte ich meine Testsuite ohne Speicherprobleme ausführen.

+0

Beobachtet das gleiche Problem beim Ausführen von Tests mit JUnit und Maven. Loglevel war bei DEBUG und beim Erstellen von OOM-Fehlern, nach dem Wechsel zu ERROR gingen die Probleme weg. – Rich

Verwandte Themen