PermGen space - jaki powinien być właściwy rozmiar?

PermGen space - jaki powinien być właściwy rozmiar?
0

Witam,
Jak wiadomo PermGen to przestrzeń, w której przechowuje się wartości klas po uruchomieniu aplikacji. Jaki powinien być rozmiar PermGen, gdy ustawiam -Xms i -Xms na 2000 MB?

Czy mogę bezpiecznie zwiększyć ten rozmiar np. do 1000 MB? Domyślnie z tego co widzę jest to 192 MB. A po kilku deployach zdarza się zobaczyć błąd PermGenSpace.

Jaki jest wpływ tych parametrów na pracę garbage collectora?

Pozdrawiam,

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Jak ci sie aplikacja wysypuje bo permgen się kończy to znaczy ze spieprzyłeś tą aplikację i to dość mocno. Chyba ze mówisz o systemie na kilka milionów linii kodu, dziesiatki tysięcy klas, która ma load tysięcy użytkowników na godzinę. Ale szczerze wątpię....
PermGen to jest coś co przechowuje definicje klas, które dużo nie zajmują... Najpewniej masz wyciek pamięci na przykład bo tworzysz dziesiątki obiektów proxy (używasz cgliba? lambda4j?) albo używasz jvm internal cache (np. String.intern()) i go wypychasz niepotrzebnie.
PermGen jest permanentny i nie wpływa w ogóle na GC. To co ta siedzi, siedzi tam cały czas.

A parametr Xms i Xmx nie mają (prawie) nic wspólnego z PermGenem bo są zwiazane z heapem...


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 2x, ostatnio: Shalom
0

Dzięki za odpowiedź.

Owszem, aplikacja jest niezle spaprana w kwestii JPA: zostalo tam ustawione RESOURCE_LOCAL i nie ma obslugi transakcji przez kontener (przez poprzednich programistow, my to rozwiajmy dalej). Nie udalo sie tego sensownie zrefaktoryzowac, ale nie ma tam transakcji rozproszonych, wiec az tak nie boli. Ja oddzidziczylem ta aplikacje, zrefaktoryzowalem i podnioslem z JEE 5.0 do 7.0. W tej chwili jest juz lepiej, ale musze pracowac ze starym kodem z duza iloscia WTFow. Ale za kazdym razem EntityManagery tworzone z fabryk sa zamykane, wiec leaka w JPA byc nie powinno.

To się dzieje wtedy, gdy idzie dużo deployów w krótkim czasie. Po pojedynczym deployu jest spoko. Projekt jest dosyć duży, miliona linii kodu nie ma, ale w przyszłości na pewno będzie. Jest to około 80 tabel w SQL. Nigdy nie było tak, aby wysypało mi się po pierwszym, ale po kilku krótkich owszem, zdarza się to często. Wychodzi na to, że szybkie deploye dużego projektu zabijają classloader. Dlaczego tak się dzieje, skoro deploy wykonuje undeploy, który powienien wyczyścić? Jak szukać tego leaka, z użyciem darmowych narzędzi?

Nie używam bibliotek, o których wspomniałeś. Za to JPA, IceFaces 1.8 (stary projekt), JSF 2.2, Spring Security i JasperReports i pare innych bibliotek.

http://stackoverflow.com/questions/7683434/permgen-space-error-glassfish-servero,

Z tego co widzę użytkownicy GlassFisha często tego doświadczają:
https://java.net/jira/browse/GLASSFISH-20732

Czy możliwe, że to defekt serwera aplikacji?

Jak najprościej szukać leaków?

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0
  1. A zabijasz serwer przed redeployem? Bo jeśli nie, to możliwe że żeby "przyspieszyć" deploy kontener nie usuwa starych definicji tylko dorzuca nowe i stąd problem że po kilku deployach kończy się permgen. IntelliJ ma taką opcję żeby deployować rozpakowanego wara i wtedy można często robić "hot-swap" klas bez konieczności budowania wara od nowa i deployowania od nowa.
  2. VisualVM, JProfiler

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 12 godzin
0

Odpalasz na JVM 32-bitowej czy 64-bitowej? Na 32 bitach może po prostu zabraknąć przestrzeni adresowej.

Może włączenie odładowywania starych klas pomoże? http://stackoverflow.com/questions/3334911/what-does-jvm-flag-cmsclassunloadingenabled-actually-do


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 2x, ostatnio: Wibowit
0

@Wibowit
Mam 64 bit JVM. Spróbuje tego rozwiązania jak tylko będę miał dostęp do maszyny z projektem.

BTW. Co sądzicie o ustawieniu takiego samego min jak i max heap size? Czytałem, że to nie jest zły pomysł, bo zmiana heap w przypadku dynamicznego zmieniania rozmiaru sterty wymaga pełnego cyklu garbage collectora, co bywa źródłem niezłych lagów. I tam gdzie lagi są nieporządane warto dać taki sam max jak i min heap size. Prawda?

KR
Moderator
  • Rejestracja:prawie 21 lat
  • Ostatnio:4 dni
  • Postów:2964
0

Prawda, ale nie cała prawda. Tak jest przy standardowym GC i przy CMS.
Ale już G1 bardzo ładnie radzi sobie ze zmienianiem rozmiaru sterty bez pełnego GC.

__krzysiek85
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 9 lat
  • Postów:1019
0

Hot deploymentu nigdy nie powinno się stosować na produkcji.

Zbyt łatwo można nieświadomie doprowadzić do sytuacji, w której klasy nie mogą być usunięte, gdyż gdzieś jest referencja do jakiejś instancji.

Wystarczy, np. zapamiętać jedną instancję klasy w ThreadLocal i już przy redeployu nie zostanie usunięta z pamięci ta klasa oraz inne ładowane przez ten sam ClassLoader.

Błąd nie musi być w Twojej aplikacji. Wystarczy, że jedna z bibliotek, której używasz ma coś takiego (np. Spring https://jira.springsource.org/browse/SPR-9274 )

http://stackoverflow.com/questions/12717895/memory-leak-on-stop-or-redeploy-spring-3-1-2-hibernate-4-1-0-spring-data-jpa

Czy mogę bezpiecznie zwiększyć ten rozmiar np. do 1000 MB? Domyślnie z tego co widzę jest to 192 MB. A po kilku deployach zdarza się zobaczyć błąd PermGenSpace.

To zależy, ile masz całej pamięci przydzielonej Javie. Permgen raczej nie powinien przekraczać 20% pamięci.


Registered Linux user #456405 | SCJP 6 | SCWCD 5 | SCBCD 5
edytowany 1x, ostatnio: __krzysiek85
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)