Повторен пълен GC с наличен Heap

Изпитвам повтарящи се пълни GC, дори когато купчината не се използва напълно.

Ето как изглеждат регистрационните файлове на gc: http://d.pr/i/iFug ( синята линия е използваната купчина, а сивите правоъгълници са пълни GC).

Изглежда, че това е проблем, подобен на този, публикуван в този въпрос: Чест пълен GC с празен купчина

Тази нишка обаче не даде реални отговори на проблема. Приложението ми използва RMI и производствените сървъри наистина използват 1.6 преди надстройката 45, която увеличи GC интервалите от 1 минута на 1 час (http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/relnotes.html). От останалата част от дневника обаче не мога да видя този модел Full-GC-every-1-min.

На какво може да се дължи това?


person halfwarp    schedule 26.09.2013    source източник


Отговори (2)


Най-вероятно причината е, че сте достигнали текущия размер на купчината. Размерът на купчината е по-малък от зададения от вас максимум и се коригира, докато програмата работи.

напр. Да кажем, че сте задали максимум 1 GB, първоначалният размер на купчината може да бъде 256 MB и когато достигнете 256 MB, той извършва пълен GC, след този GC може да реши, че 400 MB ще бъде по-добър размер и когато това достигне извършва се пълен GC и др.


Получавате голяма колекция, когато наетото пространство се запълни или не успее да намери свободно място. Например, ако е фрагментиран.

Освен това получавате пълни колекции, ако вашите пространства за оцелели са твърде малки.

Накратко, най-вероятната причина са параметрите за настройка на gc, които сте използвали. Предлагам ви да опростите параметрите си за настройка, докато системата ви започне да се държи по начин, който очаквате.

person Peter Lawrey    schedule 26.09.2013
comment
Стартирам JVM със същия min и max heap, така че не може да е така. Бих искал да опитам да настроя GC, но за съжаление това се случи в производството и мога да го възпроизведа в тестова среда. - person halfwarp; 27.09.2013

Както е отбелязано в свързаната нишка, деактивирайте изричния GC и вижте дали моделът FullGC се появява отново: -XX:+DisableExplicitGC. RMI кодът може да задейства явен GC в даден интервал, което може да не е желателно в някои случаи.

Ако все още се появяват FullGC, бих направил дъмп на нишки и евентуално дъмп на купчина, за да анализирам проблема.

Също така използвайте jstat, за да видите заетостта на пространствата Eden, Survivor, OldGen.

person Aleš    schedule 26.09.2013
comment
Това може да работи, но какви биха били страничните ефекти? Бих искал да възпроизведа това в тестова среда, но не мога. - person halfwarp; 27.09.2013
comment
Не трябва да има никакви странични ефекти, широко се обезкуражава да се извиква System.gc() - това може да навреди на производителността, така че е препоръчително да използвате само -XX:+DisableExplicitGC и да оставите GC да свърши работата. Вие основно използвате този флаг като защита от измамни библиотеки/код, който се опитва да задейства изричен GC. - person Aleš; 27.09.2013