Почему JVM постоянно выполняет полный сбор данных, в то время как старое поколение заполнено только наполовину?

Я использую jdk 1.7.0_09 на 64-битной машине CentOS с ОС Linux.

Связанные с gc vm args

-Xmx4g -Xmn2g -XX: SurvivorRatio = 4 -XX: PermSize = 128m -XX: MaxPermSize = 128m -XX: InitialTenuringThreshold = 15 -XX: CMSWaitDuration = 50 -XX: MaxTenuringThreshold = 15 -XXX:+UseConcarWS -XX:CMSInitiatingOccupancyFraction=80 -XX:+CMSParallelRemarkEnabled -XX:ReservedCodeCacheSize=128 м

Но он постоянно делает полный GC

jstat -gcutil pid 1000    
    S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
    0.00   0.00  15.62  57.52  19.90     11    2.081 11109 7454.686 7456.767   
    0.00   0.00  15.81  57.52  19.90     11    2.081 11109 7454.686 7456.767   
    0.00   0.00  15.81  57.51  19.90     11    2.081 11111 7454.892 7456.973   
    0.00   0.00  16.06  57.51  19.90     11    2.081 11111 7455.115 7457.196
    0.00   0.00  16.06  57.51  19.90     11    2.081 11111 7455.115 7457.196
    0.00   0.00  16.27  57.51  19.90     11    2.081 11111 7455.115 7457.196
    0.00   0.00  16.27  57.51  19.90     11    2.081 11111 7455.115 7457.196
    0.00   0.00  16.29  57.51  19.90     11    2.081 11111 7455.115 7457.196
    0.00   0.00  16.29  57.51  19.90     11    2.081 11111 7455.115 7457.196
    0.00   0.00  16.29  57.47  19.90     11    2.081 11113 7455.549 7457.629
    0.00   0.00  16.29  57.47  19.90     11    2.081 11113 7455.549 7457.629
    0.00   0.00  16.34  57.47  19.90     11    2.081 11113 7455.549 7457.629
    0.00   0.00  16.34  57.47  19.90     11    2.081 11113 7455.549 7457.629
    0.00   0.00  16.34  57.47  19.90     11    2.081 11113 7455.549 7457.629
    0.00   0.00  16.42  57.47  19.90     11    2.081 11114 7455.549 7457.629
    0.00   0.00  16.42  57.44  19.90     11    2.081 11115 7455.986 7458.067

2 ответа

Решение

Несмотря на колонку "ФСК", это не совсем полный сборщик мусора. То, что делает CMS, - это параллельная коллекция, чтобы увидеть, можно ли что-нибудь очистить от старой коллекции (что, как вы можете видеть, она делает). Способ сказать, что это не полный GC, состоит в том, что полный GC очищает пространство eden и копирует из одного пространства оставшихся в живых в другое.

ИМХО Чем больше вариантов вы используете, тем больше вероятность того, что вы столкнетесь с какой-то комбинацией с удивительными результатами. Я хотел бы придерживаться минимума вариантов и посмотреть, как это работает. Добавляйте опцию только тогда, когда вы знаете, что они всегда помогут.

Попробуйте начать с,

-mx4g -XX:MaxPermSize=128m -XX:+UseConcMarkSweepGC

Это нормально. Если вы сделаете "-verbose:gc", вы увидите, что "Полная" коллекция фактически является параллельной (вы указали "-XX:+UseConcMarkSweepGC"). Вы также можете видеть, что время не сильно увеличивается. И это время совпадает, а не остановит мир.

Другие вопросы по тегам