У нас есть довольно большое приложение, работающее на сервере приложений JBoss 7. Раньше мы использовали ParallelGC, но это давало нам проблемы на некоторых серверах, где куча была большой (5 ГБ и более) и обычно почти заполнялась, мы часто получали очень большие GC-паузы.
В последнее время мы улучшили использование памяти приложения и в нескольких случаях добавили больше ОЗУ на некоторые из серверов, на которых работает приложение, но мы также начали переходить на G1 в надежде сделать эти паузы менее частыми и/или короче. Вещи, похоже, улучшились, но мы наблюдаем странное поведение, которого раньше не было (с ParallelGC): Пермский генерал, кажется, заполняется довольно быстро, и как только он достигает максимального значения, запускается Full GC, что обычно вызывает длительную паузу в потоках приложений (в некоторых случаях, более 1 минуты).
Мы используем 512 МБ максимального размера в течение нескольких месяцев, и во время нашего анализа размер perm обычно будет расти примерно на 390 МБ с помощью ParallelGC. Однако после того, как мы перешли на G1, началось поведение выше. Я пробовал увеличивать максимальный размер до 1 ГБ и даже 1,5 ГБ, но все же происходят полные GC (они менее редки).
В этой ссылке вы можете увидеть скриншоты используемого нами инструмента профилирования (YourKit Java Profiler). Обратите внимание, что при запуске Full GC у Eden и Old Gen есть много свободного места, но максимальный размер Perm. Размер Perm и количество загруженных классов значительно уменьшаются после Full GC, но они снова начинают расти, и цикл повторяется. Кэш кода хорош, никогда не поднимается выше 38 МБ (в этом случае он составляет 35 МБ).
Вот отрезок журнала GC:
2013-11-28T11:15: 57.774-0300: 64445.415: [Полный GC 2126M- > 670M (5120M), 23.6325510 secs] [Eden: 4096.0K (234.0M) → 0.0B (256.0M) Выжившие: 22.0M- > 0.0B Куча: 2126.1M (5120.0M) → 670.6M (5120.0M)] [Times: user = 10.16 sys = 0.59, real = 23.64 secs]
Вы можете увидеть полный журнал здесь (с момента запуска сервера, до нескольких минут после полного GC).
Вот информация о среде:
java version "1.7.0_45"
Java (TM) SE Runtime Environment (сборка 1.7.0_45-b18)
Java HotSpot (TM) 64-разрядная серверная VM (сборка 24.45-b08, смешанный режим)
Параметры запуска: -Xms5g -Xmx5g -Xss256k -XX:PermSize=1500M -XX:MaxPermSize=1500M -XX:+UseG1GC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintAdaptiveSizePolicy -Xloggc:gc.log
Итак, вот мои вопросы:
-
Является ли это ожидаемым поведением с G1? Я нашел еще одно сообщение в Интернете о том, что кто-то спрашивает что-то очень похожее и говорит, что G1 должен выполнять инкрементные коллекции в Перми, но ответа не было...
-
Есть ли что-то, что я могу улучшить/исправить в наших параметрах запуска? Сервер имеет 8 ГБ оперативной памяти, но, похоже, нам не хватает аппаратного обеспечения, производительность приложения прекрасна до тех пор, пока не будет запущен полный GC, когда пользователи испытывают большие задержки и начинают жаловаться.