Safepoint — managed runtime ishlayotgan thread holati garbage collection, deoptimization, stack inspection yoki boshqa global operatsiya uchun xavfsiz tarzda kuzatilishi mumkin bo‘lgan nuqtadir. Runtime barcha threadlarni istalgan machine instructionda to‘xtata olmaydi, chunki register va stackdagi reference’lar qayerdaligi noma’lum yoki obyekt yangilanishi yarim holatda bo‘lishi mumkin. Safepoint uchun compiler aniq metadata yaratadi.
To‘xtash mexanizmi
Thread safepoint poll orqali runtime global stop so‘raganini tekshiradi. Poll method return, loop back-edge, allocation yoki ma’lum call joylariga qo‘yilishi mumkin. So‘rov bo‘lmasa xarajat kichik; so‘rov bo‘lsa thread runtime barrieriga kirib, register va stack holatini barqaror qoldiradi.
Stop-the-world collector barcha application threadlar safepointga kelishini kutadi. Shundan keyin root reference’lar ko‘riladi va obyektlar ko‘chirilishi mumkin. Concurrent collector pauzani qisqartirsa ham cycle’ning ayrim bosqichlari uchun safepoint talab qiladi. Native code ichidagi thread alohida holat bilan belgilanishi yoki managed runtime’ga qaytguncha kutish kerak bo‘lishi mumkin.
Metadata
Compiler har safepoint uchun stack map yaratadi: qaysi register va stack slot object reference ekanini ko‘rsatadi. Bu ma’lumot garbage collector’ga pointerga o‘xshash oddiy integer bilan haqiqiy reference’ni ajratishga yordam beradi. JIT deoptimization uchun inline frame, local variable va bytecode position ham saqlanadi.
O‘zgartirilgan obyekt state’i safepointda runtime invariantiga mos bo‘lishi kerak. Write barrier va memory ordering collector bilan application o‘rtasidagi ko‘rinishni boshqaradi. Compiler instructionlarni qayta joylashtirganda safepoint metadata va exception semanticsni saqlaydi.
Safepoint kechikishi
Global pauza faqat GC ishlagan vaqt emas. “Time to safepoint” — so‘rovdan oxirgi thread yetib kelguncha davr — uzun bo‘lishi mumkin. Juda katta hisoblash loopida poll bo‘lmasa yoki thread blocking native call’da qolsa barcha runtime operatsiyasi kechikadi. Compiler loopga poll qo‘yadi, ammo haddan tashqari ko‘p poll hot path performance’iga ta’sir qiladi.
Thread safepointga kelmayotganini runtime log va stack dump orqali aniqlash mumkin. OS scheduler starvation, signal handling va page fault ham kechikishga hissa qo‘shadi. Low-latency xizmat GC pause bilan birga safepoint sync vaqtini alohida kuzatadi.
Handshake va zamonaviy yondashuvlar
Ba’zi operatsiya barcha threadni emas, faqat bittasini yoki kichik guruhni xavfsiz holatga keltirishi mumkin. Thread-local handshake global stop xarajatini kamaytiradi. Concurrent stack walking va load barrierlar ham pauzani qisqartiradi, ammo metadata va runtime protokolini murakkablashtiradi.
Profilingda safepoint turi, sababi, kutish va actual operation vaqti ajratiladi. Benchmarkda average pauza bilan birga p99 va maksimum muhim. Safepointlar runtime implementatsiya detali bo‘lsa-da, ularning latency ta’siri application service darajasida seziladi.
Blocking operatsiyalar
Managed thread file yoki socket I/O uchun kernelda bloklanganda runtime uni safepoint-safe native state deb belgilashi mumkin. Collector uning managed reference’lari o‘zgarmasligini biladi va global pauza uchun qaytishini kutmaydi. JNI yoki FFI code managed obyektga raw pointer olib uzoq ishlasa pinning yoki handle protokoliga rioya qiladi; collector obyektni ko‘chira olmay qolishi mumkin. Critical section juda uzun bo‘lsa heap compaction va pause yomonlashadi. Runtime diagnostic qaysi thread native, blocked yoki safepointga yetmayotganini ajratadi. Application library callback orqali managed kodga qaytishdan oldin thread attachment va safepoint holatini tiklaydi.
Bog‘liq tushunchalar
Garbage collection, Stop-the-world, Stack map, Deoptimization, JIT compiler, Write barrier, Runtime