2013-06-13 10 views
8

Potrzebuję zmierzyć, ile pamięci zużywają moje testy JUnit.Sposoby mierzenia zużycia pamięci podczas wykonywania testów JUnit

  1. Więc najbardziej oczywiste (ale nie wygodnym) sposobem jest uruchomienie JVM z argumentami jak „-Xms128m -Xmx512m” i śledzić, kiedy będę miał OutOfMemory błąd.

  2. Drugi sposób polega na zażądaniu zrzutu sterty po wykonaniu wszystkich moich testów, a następnie użycia narzędzia Memory Analyzer Tool. Ale nie jest to przydatne przy każdym uruchomieniu testów.

Pożądana sposobem jest, powiedzmy, do logowania zużycie pamięci do pliku o takich wartościach jak maksymalnego zużycia pamięci, średnie zużycie, rozmów GC liczyć itd. Albo nawet narysować schemat, który pokaże jak pamięć została wykorzystana .

Pytanie brzmi, czy są jakieś narzędzia, metody lub narzędzia do tego? A może moje życzenia są nierzeczywiste i naiwne i nie ma sposobu na zebranie takich danych?

Testy działają w oparciu o IntelliJ Idea z JUnit4. Mogę używać dowolnego innego środowiska. Z góry dziękuję za radę!

+1

dobrze, jeśli używasz jakiś serwer Linux czy Unix, łatwym sposobem byłoby wykonać powłokę, która monitoruje PID i wydrukuj rozmiar pamięci w określonych odstępach czasu. Będziesz musiał uruchomić program z niskim -Xms i wysokim -Xmx. W ten sposób nie monitorowałbyś dokładnego rozmiaru sterty obiektów, ale przynajmniej rzeczywistej konsumpcji twojego procesu. Innym pomysłem, który mi się przydarza, jest dowiedzieć się, w jaki sposób serwer aplikacji drukuje informacje GC do plików dziennika i sprawdzić, czy można skonfigurować konfigurację, aby wydrukować "szczegółowe informacje GC". Zwykle obejmuje to szczegółowe informacje, które można później zinterpretować w razie potrzeby. – Martin

+1

http://www.jvmmonitor.org/ dla Eclipse, lub po prostu użyj jconsole, itp. –

+1

Nie możesz po prostu użyć profilera, powiedzmy z Eclipse? –

Odpowiedz

7
+1

Dziękuję, JConsole jest całkiem przydatna! Zastanawiam się, czy można automatycznie uruchomić JConsole i połączyć się z nowo utworzonym procesem z jednostkowymi testami? – sainr

+1

Nie jestem w pełni pewien, ale myślę, że nie jest to możliwe, o czym wspomniałeś. Możesz wprowadzić opóźnienie w teście, aby połączyć JConsole z procesem JUnit, gdy test zostanie wykonany po raz pierwszy. Na przykład '@Test public void delayTestForConnectJC() {Thread.sleep (30 * 1000);}'. Ale będziesz musiał ręcznie połączyć JConsole z procesem JUnit. –

+0

Pomysł z opóźnieniem wygląda interesująco, dziękuję! Ale w każdym razie spróbuję znaleźć coś, co pójdzie automatycznie. – sainr