Podczas wykonywania programu wielowątkowego pojawia się następujący błąd
java.lang.OutOfMemoryError: Java heap space
Powyższy błąd wystąpił w jednym z wątków.
O ile mi wiadomo, przestrzeń sterty jest zajmowana tylko przez zmienne instancji. Jeśli to prawda, to dlaczego ten błąd wystąpił po pewnym czasie działania poprawnie, ponieważ na przykład zmienne są przydzielane w momencie tworzenia obiektu.
Czy istnieje sposób na zwiększenie miejsca na sterty?
Jakie zmiany należy wprowadzić w moim programie, aby zajmował mniej miejsca na stercie?
java
multithreading
out-of-memory
heap-memory
Yatendra Goel
źródło
źródło
Odpowiedzi:
Jeśli chcesz zwiększyć swoją przestrzeń sterty, możesz użyć
java -Xms<initial heap size> -Xmx<maximum heap size>
w wierszu poleceń. Domyślnie wartości są oparte na wersji środowiska JRE i konfiguracji systemu. Więcej informacji na temat opcji maszyn wirtualnych można znaleźć w witrynie Java .Zalecałbym jednak profilowanie aplikacji, aby dowiedzieć się, dlaczego zjadany jest rozmiar twojej sterty. NetBeans zawiera bardzo dobry program do profilowania . Uważam, że wykorzystuje
jvisualvm
pod maską. Dzięki profilerowi możesz spróbować dowiedzieć się, gdzie jest tworzonych wiele obiektów, kiedy obiekty są zbierane jako elementy bezużyteczne i nie tylko.źródło
1. - Tak, ale odnosi się do całej pamięci używanej przez twój program.
2. - Tak, zobacz opcje Java VM
To znaczy
java -Xmx2g
przypisz maksymalnie 2 gigabajty pamięci RAM do swojej aplikacjiAle powinieneś najpierw sprawdzić, czy nie masz wycieku pamięci.
3.- To zależy od programu. Spróbuj wykryć wycieki pamięci. Trudno odpowiedzieć na to pytanie. Ostatnio możesz profilować za pomocą JConsole, aby spróbować dowiedzieć się, dokąd zmierza twoja pamięć
źródło
Możesz zajrzeć na tę stronę, aby dowiedzieć się więcej o pamięci w JVM: http://developer.streamezzo.com/content/learn/articles/optimization-heap-memory-usage
Zauważyłem, że przydatne jest użycie visualgc do obserwowania, jak różne części modelu pamięci zapełniają się, aby określić, co zmienić.
Trudno jest określić, która część pamięci została zapełniona, stąd visualgc, ponieważ możesz chcieć po prostu zmienić część, w której występuje problem, zamiast po prostu powiedzieć,
Postaraj się być bardziej precyzyjny w tym, co robisz, na dłuższą metę prawdopodobnie okaże się, że program jest do tego lepszy.
Aby określić, gdzie może być wyciek pamięci, możesz użyć do tego testów jednostkowych, sprawdzając, jaka była pamięć przed testem i po nim, a jeśli zmiana jest zbyt duża, możesz chcieć ją zbadać, ale musisz sprawdź, czy test jest jeszcze uruchomiony.
źródło
Aby zwiększyć wielkość sterty, można użyć argumentu -Xmx podczas uruchamiania języka Java; na przykład
źródło
Możesz uzyskać rozmiar pamięci sterty za pomocą poniższego programu.
możesz odpowiednio zwiększyć rozmiar sterty również za pomocą: java -Xmx2g http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
źródło
Oznacza to, że tworzysz więcej obiektów w swojej aplikacji przez pewien okres czasu w sposób ciągły. Nowe obiekty będą przechowywane w pamięci sterty i to jest powodem wzrostu pamięci sterty.
Sterta zawiera nie tylko zmienne instancji. Będzie przechowywać wszystkie inne niż pierwotne typy danych (obiekty). Czas życia tych obiektów może być krótki (blok metody) lub długi (do momentu odniesienia do obiektu w aplikacji)
Tak. Spójrz na ten artykuł wyroczniWięcej informacji .
Istnieją dwa parametry do ustawiania rozmiaru sterty:
-Xms:, który ustawia początkowy i minimalny rozmiar sterty
-Xmx:, który ustawia maksymalny rozmiar sterty
To zależy od twojej aplikacji.
Ustaw maksymalną pamięć sterty zgodnie z wymaganiami aplikacji
Nie powoduj wycieków pamięci w swojej aplikacji
Jeśli zauważysz wycieki pamięci w swojej aplikacji, znajdź główną przyczynę za pomocą narzędzi do profilowania, takich jak MAT , Visual VM , jconsole itp. Po znalezieniu głównej przyczyny usuń wycieki.
Ważne uwagi z artykułu oracle
Możliwe przyczyny:
Z innej strony, użyj lepszych algorytmów zbierania śmieci ( CMS lub G1GC )
Spójrz na to pytanie, aby zrozumieć G1GC
źródło
W większości przypadków kod nie jest zoptymalizowany. Wypuść te przedmioty, które Twoim zdaniem nie będą już potrzebne. Unikaj tworzenia obiektów w pętli za każdym razem. Spróbuj użyć pamięci podręcznych. Nie wiem, jak radzi sobie Twoja aplikacja. Ale w programowaniu obowiązuje również jedna zasada normalnego życia
Lepiej jest zapobiegać niż leczyć. „Nie twórz niepotrzebnych obiektów”
źródło
Zmienne lokalne znajdują się na stosie. Miejsce na stercie jest zajęte przez obiekty.
Możesz skorzystać z
-Xmx
opcji.Zasadniczo miejsce na sterty jest zużywane za każdym razem, gdy przydzielasz nowy obiekt
new
i zwalniasz jakiś czas po tym, jak obiekt nie jest już przywoływany. Dlatego upewnij się, że nie zachowujesz odniesień do obiektów, których już nie potrzebujesz.źródło
Nie, myślę, że myślisz o miejscu na stosie. Miejsce na stercie jest zajęte przez obiekty. Sposobem na zwiększenie jest -Xmx256m, zastępując 256 ilością potrzebną w wierszu poleceń.
źródło
Aby uniknąć tego wyjątku, jeśli używasz JUnit i Spring, spróbuj dodać to w każdej klasie testowej:
źródło
W netbeans przejdź do paska narzędzi „Uruchom”, -> „Ustaw konfigurację projektu” -> „Dostosuj” -> „uruchom” wyskakującego okna -> „Opcja maszyny wirtualnej” -> wypełnij „-Xms2048m” -Xmx2048m ”. To może rozwiązać problem wielkości sterty.
źródło