Концепция Java GC: CMSInitiatingOccupancyFraction

У меня есть настройки памяти:

export MEM_OPTS = "- Xmx2560m -Xms2560m -XX: NewSize = 786m -XX: MaxNewSize = 786m -XX: + UseTLAB -XX: MaxPermSize = 512m"

Параметры GC следующие:

export GC1_OPTS = "- XX: + UseConcMarkSweepGC -XX: + UseParNewGC -XX: CMSInitiatingOccupancyFraction = 50 -XX: + CMSPermGenSweepingEnabled -XX: + CMSClassUnloadingEnabled -XX: + CMSParallelRemarkEnabled -XX: + UseAdaptiveGCBoundary" export GC2_OPTS = "- XX: + ExplicitGCInvokesConcurrent"

Я хотел бы знать, когда CMS запустится. Будет ли он работать после 50% из 2560 МБ или будет ли он работать после 50% от 512 МБ памяти.

Что такое концепция?

Моя общая память кучи будет = 2560 + 786 + 512 МБ.... правильно? или "-XX: NewSize = 786m -XX: MaxNewSize = 786m" для NON Heap. Пожалуйста, объясните концепцию.

Ответ 1

Ни. Он будет работать после того, как занятость старого поколения достигнет 50%, где размер старого поколения будет размером кучи за вычетом размера нового поколения: 2560 м - 786 м = 1792 м, так что это будет после старое поколение достигает 896 м. Но это не всегда единственный параметр. Вы можете захотеть добавить -XX: + UseCMSInitiatingOccupancyOnly, если вы хотите, чтобы он стал единственным параметром (хотя, по моему опыту, CMS фактически запускает на пороге, даже без него).

Подводя итог:

  • -Xmx - общая память кучи
  • -XX:NewSize/-XX:MaxNewSize - это диапазон размеров нового поколения внутри этой кучи
  • разница - это диапазон размера старого поколения
  • -XX:PermSize/-XX:MaxPermSize - это диапазон размера постоянного поколения, который является памятью без кучи.