Serial GC
Axlat yig'ish Java'da xotira bilan ishlash samaradorligini oshiradi, chunki unga linklar bo'lmagan obyektlar yig'ilib, yangi obyektlar uchun joy bo'shatiladi.
Java virtual mashinasida sakkiz turdagi axlat yig'uvchilar bor. Har birini batafsil ko'rib chiqamiz.
Seriyali GC — GC'ning eng oddiy realizatsiyasi. U kichik dasturlar uchun mo'ljallangan, bir oqimli muhitda ishlaydigan. Axlat yig'ishning barcha voqealari ketma-ketlikda bitta oqimda amalga oshiriladi. Har bir axlat yig'ishdan keyin zichlashtirish amalga oshiriladi.
Yig'uvchi ishga tushirilganda dastur "to'xtatish dunyosi" voqeasiga sabab bo'ladi, ya'ni barcha dastur to'xtab qoladi. Axlat yig'ish vaqtida barcha dastur muzlatiladi, shuning uchun real hayotda bu kabi foydalanish tavsiya etilmaydi, agar minimal kechikish kerak bo'lsa.
JVM argumenti seriyali axlat yig'uvchi foydalanish uchun -XX:+UseSerialGC.
Parallel GC
Parallel axlat yig'uvchi o'rta va katta ma'lumot to'plamlariga ega dasturlar uchun mo'ljallangan bo'lib, ular ko'p oqimli yoki ko'p protsessorli uskunada ishlaydi. Bu default GC hal qilish va u kengayish yig'uvchi sifatida ham tanilgan.
Birinchi navbatda, kichik axlat yig'ish uchun bir nechta oqimlar mo'ljallangan. Keksa avlodda asosiy axlat yig'ish faqat bitta oqim tomonidan amalga oshiriladi.
Parallel GC'ni ishga tushirish ham “to'xtatish dunyosi” ni chaqiradi va dasturga to'siq qo'yadi. Bu xatti-harakatlar ko'p oqimli muhit uchun ko'proq mos keladi, qachonki ko'p vazifalarni yakunlash kerak bo'lsa va uzoq pauzalar ruxsat etilgan bo'lsa, masalan, ommaviy vazifa bajarilayotganda.
JVM argumenti parallel axlat yig'uvchi foydalanish uchun: -XX:+UseParallelGC.
CMS GC
Pastki pauza parallel yig'uvchi sifatida ham tanilgan.
Bu yerda kichik axlat yig'ish uchun bir nechta oqimlar jalb qilinadi, bu parallel yig'uvchi kabi algoritm orqali sodir bo'ladi. Asosiy axlat yig'ish ko'p oqimli, eski parallel GC'da bo'lgani kabi, lekin CMS dasturning jarayonlari bilan bir vaqtda ishlaydi, “to'xtatish dunyosi” voqealarini minimallashtiradi.
Shu sababli, CMS yig'uvchi boshqa yig'uvchilarga nisbatan ko'proq protsessor resurslarini iste'mol qiladi. Agar sizda ko'proq protsessor resurslarini ajratish imkoniyati mavjud bo'lsa, CMS oddiy parallel yig'uvchidan ko'ra afzaldir. CMS GC'da zichlashtirish amalga oshirilmaydi.
JVM argumenti paralleling axlat yig'uvchi bilan belgilash quvati uchun: -XX:+UseConcMarkSweepGC.
G1 (Garbage first) GC
G1GC CMS'ga o'rinbosar sifatida mo'ljallangan va katta o'lchamdagi (4GB dan ortiq) ko'p oqimli dasturlar uchun ishlab chiqilgan. U CMS kabi parallel va raqobatchi, lekin "kapot ostida" u eski axlat yig'uvchilarga qaraganda juda boshqacha ishlaydi.
Garchi G1 avlodlar tamoyiliga ko'ra ishlasa-da, unda yosh va keksa avlodlar uchun alohida joylar mavjud emas. Buning o'rniga har bir avlod joylar to'plamidan iborat bo'lib, bu yosh avlod hajmini egiluvchan qilib o'zgartirishga imkon beradi.
G1 kachirani bir xil o'lchamdagi joylar to'plamiga bo'ladi (kachirani hajmiga qarab) va ularni bir nechta oqimlarda skanerlashni amalga oshiradi. Dastur bajarayotgan vaqtida joylar yana va yana old va yosh bo'lib o'zgarishi mumkin.
Belgilar bosqichi tugagandan so'ng, G1 qaysi joylar eng ko'p axlatga ega ekanligini biladi. Agar foydalanuvchi pauzalarni minimallashtirishni xohlasa, G1 faqat bir nechta joylarni tanlashi mumkin. Agar foydalanuvchi uchun pauza vaqti muhim bo'lmasa yoki bu vaqt chegarasi yuqori o'rnatilsa, G1 ko'proq joylar orqali o'tadi.
Chunki G1 GC axlatning eng ko'p bo'lgan hududlarini aniqlaydi va ularni birinchi navbatda tozalaydi, "Axlat - birinchi" deb ataladi.
G1GC'da Eden, Survivor va Old Memory joylaridan tashqari yana ikkita tur mavjud.
- Humongous (Katta) — katta hajmli obyektlar uchun (kachiraning 50% dan ortiq hajmiga ega).
- Available (Mavjud) — foydalanilmagan yoki ajratilgan joy.
JVM argumenti G1 axlat yig'uvchi foydalanish uchun: -XX:+UseG1GC.
Shenandoah (Shandara)
Shenandoah - JDK 12 qismi sifatida chiqarilgan yangi GC. G1 bilan solishtirganda Shenandoah'ning asosiy afzalligi shundaki, axlat yig'ish tsiklning katta qismi dastur oqimlari bilan bir vaqtda amalga oshiriladi. G1 faqat dastur to'xtatilganda kachira joylarni evakuatsiya qilish imkoniga ega, Shenandoah esa obyektlarni dastur bilan bir vaqtda ko'chiradi.
Shenandoah tirik obyektlarni zichlashtirishi, axlatni tozalashi va erkin xotirani topishi bilan bir zumda xotirani bo'shatishi mumkin. Barchasi bir vaqtda, dastur ishlashini to'xtatmasdan amalga oshiriladi, Shenandoah protsessorni faol ishlatadi.
JVM argumenti Shenandoah axlat yig'uvchi uchun: -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC.ZGC
ZGC - JDK 11 qismi sifatida chiqarilgan va JDK 12da yaxshilangan yana bir axlat yig'uvchi.
U yuqori tezlik va past kechikishni (10ms dan kam pausalari) va/yoki juda katta kachira (bir necha TB) talab qiladigan dasturlar uchun mo'ljallangan.
ZGC'ning asosiy maqsadlari kam kechikish, masshtablanuvchanlik va qo'llanilish soddaligidir. Buning uchun Java dasturi axlat yig'ish ishlari bajarilayotganiga qaramay ishlashda davom etishiga imkon beradi. ZGC faol bo'lmagan xotirani bo'shatadi va uni operatsion tizimga qaytaradi.
Shu sababli ZGC boshqa an'anaviy GC'ga qaraganda sezilarli yaxshilanishni olib keladi, juda past pauza vaqtini ta'minlaydi (odatda 2ms atrofida).
JVM argumenti ZGC axlat yig'uvchi foydalanish uchun: -XX:+UnlockExperimentalVMOptions -XX:+UseZGC.
GO TO FULL VERSION