/ / Защо FullGC не може да пусне физическа памет (RES)? - java, събиране на боклук

Защо FullGC не може да пусне физическа памет (RES)? - java, събиране на боклук

По - долу е ВЕИ крива на растежа: въведете описанието на изображението тук

тогава е Старият ген Фракция на заетост: въведете описанието на изображението тук

Принуждавайки Full GC от jmap, старият gen наистина намалява, но RES се разраства ...

Резултат на pmap:

въведете описанието на изображението тук

Какъв е смисъла на веднага, това е памет, която не е купчина?

редактиране:

въведете описанието на изображението тук

въведете описанието на изображението тук

въведете описанието на изображението тук

въведете описанието на изображението тук

Хари използва само около 500MB, но RSS надвишава 15GB, pmap показва, че много веднага около 65 МБ.

Въпросът ми е "Какво можеше да погълне паметта извън купчината? Благодаря!

Отговори:

1 за отговор № 1

Oracle JVM има няколко алгоритми за управление на паметта. Някои от тях могат да върнат неизползвани страници с памет в операционната система, други не могат.

Алгоритъмът по подразбиране (паралелен колектор) никога не връща паметта в операционната система.

Следват два алгоритъма, които могат да върнат паметта в операционната система

  • Сериен GC (компактен компактен маркер с резба)
  • G1

Намерете резюме на наличните алгоритми и съответните опции на JVM тук.


1 за отговор № 2

Какво е значението на anon, това е памет, която не е купчина?

anon просто означава, че е било mmap()с г MAP_ANON, Като се има предвид RSS, това вероятно е купчина.

Защо FullGC не може да пусне физическа памет (RES)?

Трябва да направите разграничение между максималния размер на купчина, заетостта на купчини и размера на грамажа.

  • максималният размер на купюра е адресното пространство, което ще бъде запазено отпред, но не непременно подкрепено от страници
  • размерът на купчината ще бъде подкрепен от страници и обикновено е нулиран / прецизиран. това обикновено оказва влияние върху вашия RSS
  • заетостта е фракцията, която всъщност съдържа обекти вместо нули

Само когато размерът на ангажираните купчини пада на страници мога да бъде освободен обратно в операционната система.

Разграждането / предаването на паметта на операционната система зависи от GC алгоритъма, версията на JVM и параметрите за настройка (цели за пауза, MaxHeapFreeRatio).


Другите региони, които изброявате, вероятно са директни разпределения на ByteBuffer, но те биха могли да бъдат и други разпределения от местни библиотеки. Разглеждане на купчинка за java.nio.DirectByteBuffer трябва да осигурят по-нататъшно прозрение.