После последовательного Full GC (эргономика) размер кучи не изменился - PullRequest
0 голосов
/ 09 декабря 2018

В моей программе много потоков, один из которых постоянно запрашивает память и не освобождает ее.Как показывает журнал gc, я обнаружил последовательный Full GC (эргономика), но программа не получила больше памяти, и все потоки были остановлены, за исключением потока сборки мусора JVM.Я прочитал официальную документацию, GC Ergonomics пытается увеличить или уменьшить кучу для достижения специальной цели, такой как минимальная пауза и / или пропускная способность.Однако после Full GC (Ergonomics), как показывает журнал gc, куча Размер пространства не изменился, как старый, так и молодой.

Я удивляюсь, почему размер кучи не изменился после Full GC (эргономика)

Мой компьютер имеет 16 ГБ памяти и без подкачки.На этом компьютере не запускается никакое другое приложение

Аргументы JVM: -XX:+PrintGCDateStamps -Xloggc:gc.log -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.managementote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Xmx10G -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails журнал gc: журнал gc

использование кучи после gc

1 Ответ

0 голосов
/ 11 декабря 2018

Здесь есть несколько вещей, на которые стоит обратить внимание.

Во-первых, то, как вы описываете свое приложение, выглядит классической утечкой памяти (даже если это преднамеренно).Если у вас есть поток, который продолжает выделять объекты, на которые он ссылается, в конечном итоге вам не хватит места в куче.Глядя на журнал GC и график кучи, это именно то, что происходит.Полные ГХ работают постоянно, чтобы попытаться освободить место для работы вашего приложения.Сборщик не освобождает места, что удивляет меня тем, что виртуальная машина не останавливается с ошибкой OutOfMemoryError.OutOfMemoryError будет иметь место, если куча постоянно заполнена на 98% или более и GC не может освободить более 2% пространства.Журнал GC показывает, что это правда.

Следующий вопрос - почему пространство кучи не расширяется выше 8 Гб.Вы устанавливаете опцию -Xmx на 10 Гб, так что логично ожидать, что куча вырастет до этого размера, если потребуется.На 16-гигабайтной машине нет причин, чтобы этого не произошло.Я бы добавил опцию -Xms, чтобы также установить начальный размер 10 Гб, что заставит JVM зарезервировать все это пространство при запуске.

Как было указано в комментариях, вы должны профилировать свое приложение.чтобы лучше понять, на какие объекты вы ссылаетесь, и если есть какой-то способ, вы можете уменьшить это.С неограниченным набором данных вы всегда достигнете точки, в которой приложение не сможет продолжить работу.

...