По - долу е ВЕИ крива на растежа:
тогава е Старият ген Фракция на заетост:
Принуждавайки Full GC от jmap, старият gen наистина намалява, но RES се разраства ...
Резултат на pmap:
Какъв е смисъла на веднага, това е памет, която не е купчина?
редактиране:
Хари използва само около 500MB, но RSS надвишава 15GB, pmap показва, че много веднага около 65 МБ.
Въпросът ми е "Какво можеше да погълне паметта извън купчината? Благодаря!
Отговори:
1 за отговор № 1Oracle JVM има няколко алгоритми за управление на паметта. Някои от тях могат да върнат неизползвани страници с памет в операционната система, други не могат.
Алгоритъмът по подразбиране (паралелен колектор) никога не връща паметта в операционната система.
Следват два алгоритъма, които могат да върнат паметта в операционната система
- Сериен GC (компактен компактен маркер с резба)
- G1
Намерете резюме на наличните алгоритми и съответните опции на JVM тук.
1 за отговор № 2
Какво е значението на anon, това е памет, която не е купчина?
anon просто означава, че е било mmap()
с г MAP_ANON
, Като се има предвид RSS, това вероятно е купчина.
Защо FullGC не може да пусне физическа памет (RES)?
Трябва да направите разграничение между максималния размер на купчина, заетостта на купчини и размера на грамажа.
- максималният размер на купюра е адресното пространство, което ще бъде запазено отпред, но не непременно подкрепено от страници
- размерът на купчината ще бъде подкрепен от страници и обикновено е нулиран / прецизиран. това обикновено оказва влияние върху вашия RSS
- заетостта е фракцията, която всъщност съдържа обекти вместо нули
Само когато размерът на ангажираните купчини пада на страници мога да бъде освободен обратно в операционната система.
Разграждането / предаването на паметта на операционната система зависи от GC алгоритъма, версията на JVM и параметрите за настройка (цели за пауза, MaxHeapFreeRatio
).
Другите региони, които изброявате, вероятно са директни разпределения на ByteBuffer, но те биха могли да бъдат и други разпределения от местни библиотеки. Разглеждане на купчинка за java.nio.DirectByteBuffer
трябва да осигурят по-нататъшно прозрение.