Концепция 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
- это диапазон размера постоянного поколения, который является памятью без кучи.