2015-07-23 15 views
5

Proces java, który używam, działa niezmiennie dobrze w ciągu pierwszej godziny lub tak, że działa. Jednak wydajność szybko się pogarsza. Podczas profilowania znalazłem, że zbieranie śmieci metaspace się dość często, aż godzinie i potem wymknął się spod kontroli:Java 8 metaspace wywóz śmieci

enter image description here

Jestem całkiem pewien, że będę w stanie rozwiązać ten problem za pomocą -XX: Opcja MaxMetaspaceSize. Chciałbym jednak wiedzieć więcej o przyczynach takiego zachowania. Nie mogę sobie wyobrazić, dlaczego algorytm zbierania śmieci miałby się tak zachowywać. Czy ktoś ma jakieś wyjaśnienie lub poradę na temat lepszej poprawki? Dzięki

+0

Myślę, że za pomocą niektórych ramy, które generują klasy w RunTime. I w końcu wymyka się spod kontroli. Rozwiązanie zależy od używanego frameworka. – talex

+0

Dzięki, i tak, jestem. To mi się przydarzyło, ale tempo, w jakim generowane są klasy, nie wydaje się zmieniać. Wszystko, co wydaje się zmieniać, to spadek częstotliwości gc. – user1675642

+0

To prawdopodobnie niektóre heurystyki JVM. Próbuje znaleźć lepsze parametry, takie jak maksymalny rozmiar. Również wygląda jak efekt stroboskopowy. Rozmiar metaspazy mierzony w określonym momencie. Gdy częstotliwość GC jest w przybliżeniu taka sama jak częstotliwość pomiaru, mogą wystąpić pewne dziwne efekty. – talex

Odpowiedz

3

Możesz spróbować ustawić -XX:MaxMetaspaceExpansion=0. To powinno wymusić pełne GC - uwalniając dynamicznie stworzone dane metod/klas - przed próbą rozwinięcia metaprzestrzeni. Dodatkowo możesz spróbować ustawić MaxMetaspaceFreeRatio na wartość niższą niż domyślna, aby zmniejszyć metaprzestrzeń po GC.

Zobacz this answer dla innych opcji związanych z metaprzestrzennymi.

Sam zbiór metaprzestrzenny opiera się na klasach wyładowywanych przez śmieciarz. Tak więc w zależności od GC używasz ulepszeń, które pomogą szybciej odzyskać śmieci.