நவீன இயங்குநேர அமைப்புகளுக்கு சக்தி தரும் அடிப்படைக் குப்பை சேகரிப்பு வழிமுறைகளை ஆராயுங்கள். இது உலகெங்கிலும் நினைவக மேலாண்மை மற்றும் செயலி செயல்திறனுக்கு இன்றியமையாதது.
இயங்குநேர அமைப்புகள்: குப்பை சேகரிப்பு வழிமுறைகளின் ஒரு ஆழமான பார்வை
கணினி உலகின் சிக்கலான சூழலில், இயங்குநேர அமைப்புகள் நமது மென்பொருட்களுக்கு உயிர் கொடுக்கும் கண்ணுக்குத் தெரியாத இயந்திரங்கள் ஆகும். அவை வளங்களை நிர்வகிக்கின்றன, குறியீட்டை இயக்குகின்றன, மேலும் செயலிகளின் சீரான செயல்பாட்டை உறுதி செய்கின்றன. பல நவீன இயங்குநேர அமைப்புகளின் மையத்தில் ஒரு முக்கிய கூறு உள்ளது: குப்பை சேகரிப்பு (Garbage Collection - GC). GC என்பது, செயலியால் இனி பயன்படுத்தப்படாத நினைவகத்தை தானாகவே மீட்டெடுக்கும் ஒரு செயல்முறையாகும். இது நினைவகக் கசிவுகளைத் தடுத்து, திறமையான வளப் பயன்பாட்டை உறுதி செய்கிறது.
உலகெங்கிலும் உள்ள டெவலப்பர்களுக்கு, GC-ஐப் புரிந்துகொள்வது என்பது சுத்தமான குறியீட்டை எழுதுவது மட்டுமல்ல; அது வலுவான, செயல்திறன் மிக்க மற்றும் அளவிடக்கூடிய செயலிகளை உருவாக்குவதாகும். இந்த விரிவான ஆய்வு, குப்பை சேகரிப்புக்கு ஆற்றல் அளிக்கும் முக்கிய கருத்துகள் மற்றும் பல்வேறு வழிமுறைகளை ஆழமாக ஆராயும். இது பல்வேறு தொழில்நுட்பப் பின்னணியில் உள்ள நிபுணர்களுக்கு மதிப்புமிக்க நுண்ணறிவுகளை வழங்கும்.
நினைவக மேலாண்மையின் கட்டாயம்
குறிப்பிட்ட வழிமுறைகளை ஆராய்வதற்கு முன்பு, நினைவக மேலாண்மை ஏன் இவ்வளவு முக்கியமானது என்பதைப் புரிந்துகொள்வது அவசியம். பாரம்பரிய நிரலாக்க முறைகளில், டெவலப்பர்கள் நினைவகத்தை கைமுறையாக ஒதுக்கி விடுவிக்கின்றனர். இது நுணுக்கமான கட்டுப்பாட்டை வழங்கினாலும், இது பிழைகளின் ஒரு மோசமான ஆதாரமாகவும் உள்ளது:
- நினைவகக் கசிவுகள்: ஒதுக்கப்பட்ட நினைவகம் இனி தேவைப்படாதபோது வெளிப்படையாக விடுவிக்கப்படாவிட்டால், அது தொடர்ந்து பயன்படுத்தப்பட்டு, கிடைக்கக்கூடிய நினைவகத்தின் படிப்படியான குறைவுக்கு வழிவகுக்கிறது. காலப்போக்கில், இது செயலி மெதுவாக இயங்க அல்லது முற்றிலும் செயலிழக்க காரணமாகலாம்.
- தொங்கும் சுட்டிகள் (Dangling Pointers): நினைவகம் விடுவிக்கப்பட்ட பிறகும், ஒரு சுட்டி அதைக் குறிப்பிட்டால், அந்த நினைவகத்தை அணுக முயற்சிப்பது வரையறுக்கப்படாத நடத்தைக்கு வழிவகுக்கும், இது பெரும்பாலும் பாதுகாப்பு பாதிப்புகள் அல்லது செயலிழப்புகளுக்கு காரணமாகிறது.
- இரட்டை விடுவிப்புப் பிழைகள் (Double Free Errors): ஏற்கனவே விடுவிக்கப்பட்ட நினைவகத்தை மீண்டும் விடுவிப்பதும் தரவுச் சிதைவு மற்றும் உறுதியற்ற தன்மைக்கு வழிவகுக்கிறது.
குப்பை சேகரிப்பு மூலம் தானியங்கி நினைவக மேலாண்மை, இந்த சுமைகளைக் குறைப்பதை நோக்கமாகக் கொண்டுள்ளது. பயன்படுத்தப்படாத நினைவகத்தைக் கண்டறிந்து மீட்டெடுக்கும் பொறுப்பை இயங்குநேர அமைப்பு ஏற்றுக்கொள்கிறது, இதனால் டெவலப்பர்கள் கீழ்நிலை நினைவகக் கையாளுதலுக்குப் பதிலாக செயலியின் தர்க்கத்தில் கவனம் செலுத்த முடிகிறது. இது உலகளாவிய சூழலில் மிகவும் முக்கியமானது, ஏனெனில் மாறுபட்ட வன்பொருள் திறன்கள் மற்றும் பயன்பாட்டுச் சூழல்கள் நெகிழ்வான மற்றும் திறமையான மென்பொருளை அவசியமாக்குகின்றன.
குப்பை சேகரிப்பில் உள்ள முக்கிய கருத்துகள்
அனைத்து குப்பை சேகரிப்பு வழிமுறைகளுக்கும் பல அடிப்படைக் கருத்துகள் அடிப்படையாக உள்ளன:
1. சென்றடையக்கூடிய தன்மை (Reachability)
பெரும்பாலான GC வழிமுறைகளின் அடிப்படைக் கொள்கை சென்றடையக்கூடிய தன்மை ஆகும். ஒரு பொருள், அறியப்பட்ட, "செயலில்" உள்ள மூலங்களின் தொகுப்பிலிருந்து அந்தப் பொருளுக்கு ஒரு பாதை இருந்தால், அது சென்றடையக்கூடியதாகக் கருதப்படுகிறது. மூலங்கள் பொதுவாக பின்வருவனவற்றை உள்ளடக்கும்:
- உலகளாவிய மாறிகள் (Global variables)
- இயக்க அடுக்கில் உள்ள உள்ளூர் மாறிகள் (Local variables on the execution stack)
- CPU பதிவேடுகள் (CPU registers)
- நிலையான மாறிகள் (Static variables)
இந்த மூலங்களிலிருந்து சென்றடைய முடியாத எந்தவொரு பொருளும் குப்பை எனக் கருதப்பட்டு மீட்டெடுக்கப்படலாம்.
2. குப்பை சேகரிப்பு சுழற்சி
ஒரு பொதுவான GC சுழற்சி பல கட்டங்களைக் கொண்டுள்ளது:
- குறியிடுதல் (Marking): GC மூலங்களிலிருந்து தொடங்கி, பொருள் வரைபடத்தை கடந்து, சென்றடையக்கூடிய அனைத்து பொருட்களையும் குறியிடுகிறது.
- துடைத்தல் (Sweeping) (அல்லது சுருக்குதல் - Compacting): குறியிட்ட பிறகு, GC நினைவகத்தின் வழியாகச் செல்கிறது. குறியிடப்படாத பொருட்கள் (குப்பை) மீட்டெடுக்கப்படுகின்றன. சில வழிமுறைகளில், சென்றடையக்கூடிய பொருட்கள் துண்டாக்கப்படுவதைக் குறைக்க தொடர்ச்சியான நினைவக இடங்களுக்கு நகர்த்தப்படுகின்றன (சுருக்குதல்).
3. இடைநிறுத்தங்கள் (Pauses)
GC-யில் ஒரு குறிப்பிடத்தக்க சவால் உலகை நிறுத்தும் (stop-the-world - STW) இடைநிறுத்தங்கள் ஆகும். இந்த இடைநிறுத்தங்களின் போது, செயலியின் இயக்கம் நிறுத்தப்படுகிறது, இதனால் GC அதன் செயல்பாடுகளை குறுக்கீடு இல்லாமல் செய்ய முடியும். நீண்ட STW இடைநிறுத்தங்கள் செயலியின் மறுமொழித்திறனை கணிசமாக பாதிக்கலாம், இது எந்தவொரு உலகளாவிய சந்தையிலும் பயனர் எதிர்கொள்ளும் செயலிகளுக்கு ஒரு முக்கியமான கவலையாகும்.
முக்கிய குப்பை சேகரிப்பு வழிமுறைகள்
பல ஆண்டுகளாக, பல்வேறு GC வழிமுறைகள் உருவாக்கப்பட்டுள்ளன, ஒவ்வொன்றும் அதன் சொந்த பலம் மற்றும் பலவீனங்களைக் கொண்டுள்ளன. அவற்றில் மிகவும் பரவலான சிலவற்றை நாம் ஆராய்வோம்:
1. குறியிட்டு-துடைத்தல் (Mark-and-Sweep)
குறியிட்டு-துடைத்தல் வழிமுறை பழமையான மற்றும் மிகவும் அடிப்படையான GC நுட்பங்களில் ஒன்றாகும். இது இரண்டு தனித்தனி கட்டங்களில் செயல்படுகிறது:
- குறியிடும் கட்டம் (Mark Phase): GC மூலத் தொகுப்பிலிருந்து தொடங்கி முழு பொருள் வரைபடத்தையும் கடந்து செல்கிறது. எதிர்கொள்ளும் ஒவ்வொரு பொருளும் குறியிடப்படுகிறது.
- துடைக்கும் கட்டம் (Sweep Phase): பின்னர் GC முழு நினைவகக் குவியலையும் ஸ்கேன் செய்கிறது. குறியிடப்படாத எந்தவொரு பொருளும் குப்பையாகக் கருதப்பட்டு மீட்டெடுக்கப்படுகிறது. மீட்டெடுக்கப்பட்ட நினைவகம் எதிர்கால ஒதுக்கீடுகளுக்காக ஒரு இலவச பட்டியலில் சேர்க்கப்படுகிறது.
நன்மைகள்:
- கருத்துரீதியாக எளிமையானது மற்றும் பரவலாகப் புரிந்து கொள்ளப்பட்டது.
- சுழற்சி தரவு கட்டமைப்புகளை திறம்பட கையாளுகிறது.
குறைகள்:
- செயல்திறன்: முழு நினைவகக் குவியலையும் கடந்து அனைத்து நினைவகத்தையும் ஸ்கேன் செய்ய வேண்டியிருப்பதால் மெதுவாக இருக்கலாம்.
- துண்டாக்கம் (Fragmentation): பொருட்கள் வெவ்வேறு இடங்களில் ஒதுக்கப்பட்டு விடுவிக்கப்படுவதால் நினைவகம் துண்டாக்கப்படுகிறது, இது போதுமான மொத்த இலவச நினைவகம் இருந்தாலும் ஒதுக்கீடு தோல்விகளுக்கு வழிவகுக்கும்.
- STW இடைநிறுத்தங்கள்: பொதுவாக நீண்ட உலகை நிறுத்தும் இடைநிறுத்தங்களை உள்ளடக்கியது, குறிப்பாக பெரிய நினைவகக் குவியல்களில்.
உதாரணம்: ஜாவாவின் குப்பை சேகரிப்பாளரின் ஆரம்ப பதிப்புகள் ஒரு அடிப்படை குறியிட்டு-துடைத்தல் அணுகுமுறையைப் பயன்படுத்தின.
2. குறியிட்டு-சுருக்குதல் (Mark-and-Compact)
குறியிட்டு-துடைத்தலின் துண்டாக்க சிக்கலைக் கையாள, குறியிட்டு-சுருக்குதல் வழிமுறை மூன்றாவது கட்டத்தைச் சேர்க்கிறது:
- குறியிடும் கட்டம் (Mark Phase): குறியிட்டு-துடைத்தலைப் போலவே, இது சென்றடையக்கூடிய அனைத்து பொருட்களையும் குறியிடுகிறது.
- சுருக்கும் கட்டம் (Compact Phase): குறியிட்ட பிறகு, GC குறியிடப்பட்ட (சென்றடையக்கூடிய) அனைத்து பொருட்களையும் நினைவகத்தின் தொடர்ச்சியான தொகுதிகளுக்கு நகர்த்துகிறது. இது துண்டாக்கத்தை நீக்குகிறது.
- துடைக்கும் கட்டம் (Sweep Phase): பின்னர் GC நினைவகத்தின் வழியாக துடைக்கிறது. பொருட்கள் சுருக்கப்பட்டதால், இலவச நினைவகம் இப்போது நினைவகக் குவியலின் முடிவில் ஒரு ஒற்றைத் தொடர்ச்சியான தொகுதியாக உள்ளது, இது எதிர்கால ஒதுக்கீடுகளை மிக வேகமாக செய்கிறது.
நன்மைகள்:
- நினைவகத் துண்டாக்கத்தை நீக்குகிறது.
- வேகமான அடுத்தடுத்த ஒதுக்கீடுகள்.
- சுழற்சி தரவு கட்டமைப்புகளை இன்னும் கையாளுகிறது.
குறைகள்:
- செயல்திறன்: சுருக்கும் கட்டம் கணக்கீட்டு ரீதியாக செலவாகும், ஏனெனில் இது நினைவகத்தில் பல பொருட்களை நகர்த்துவதை உள்ளடக்கியது.
- STW இடைநிறுத்தங்கள்: பொருட்களை நகர்த்த வேண்டிய தேவை காரணமாக கணிசமான STW இடைநிறுத்தங்களை ஏற்படுத்துகிறது.
உதாரணம்: இந்த அணுகுமுறை பல மேம்பட்ட சேகரிப்பாளர்களுக்கு அடித்தளமாக உள்ளது.
3. நகலெடுக்கும் குப்பை சேகரிப்பு (Copying Garbage Collection)
நகலெடுக்கும் GC நினைவகக் குவியலை இரண்டு இடங்களாகப் பிரிக்கிறது: இங்கிருந்து-இடம் (From-space) மற்றும் இங்கு-இடம் (To-space). பொதுவாக, புதிய பொருட்கள் இங்கிருந்து-இடத்தில் ஒதுக்கப்படுகின்றன.
- நகலெடுக்கும் கட்டம் (Copying Phase): GC தூண்டப்படும்போது, GC இங்கிருந்து-இடத்தை மூலங்களிலிருந்து தொடங்கி கடந்து செல்கிறது. சென்றடையக்கூடிய பொருட்கள் இங்கிருந்து-இடத்திலிருந்து இங்கு-இடத்திற்கு நகலெடுக்கப்படுகின்றன.
- இடங்களை மாற்றுதல் (Swap Spaces): சென்றடையக்கூடிய அனைத்து பொருட்களும் நகலெடுக்கப்பட்டவுடன், இங்கிருந்து-இடத்தில் குப்பை மட்டுமே இருக்கும், மற்றும் இங்கு-இடத்தில் அனைத்து செயலில் உள்ள பொருட்களும் இருக்கும். பின்னர் இடங்களின் பங்குகள் மாற்றப்படுகின்றன. பழைய இங்கிருந்து-இடம் அடுத்த சுழற்சிக்குத் தயாராக, புதிய இங்கு-இடமாக மாறுகிறது.
நன்மைகள்:
- துண்டாக்கம் இல்லை: பொருட்கள் எப்போதும் தொடர்ச்சியாக நகலெடுக்கப்படுகின்றன, எனவே இங்கு-இடத்தில் துண்டாக்கம் இல்லை.
- வேகமான ஒதுக்கீடு: ஒதுக்கீடுகள் வேகமானவை, ஏனெனில் அவை தற்போதைய ஒதுக்கீட்டு இடத்தில் ஒரு சுட்டியை நகர்த்துவதை மட்டுமே உள்ளடக்குகின்றன.
குறைகள்:
- இடத்தின் கூடுதல் செலவு (Space Overhead): இரண்டு இடங்கள் செயலில் இருப்பதால், ஒற்றை நினைவகக் குவியலை விட இரண்டு மடங்கு நினைவகம் தேவைப்படுகிறது.
- செயல்திறன்: பல பொருட்கள் செயலில் இருந்தால் செலவாகும், ஏனெனில் அனைத்து செயலில் உள்ள பொருட்களையும் நகலெடுக்க வேண்டும்.
- STW இடைநிறுத்தங்கள்: இன்னும் STW இடைநிறுத்தங்கள் தேவை.
உதாரணம்: தலைமுறை குப்பை சேகரிப்பாளர்களில் 'இளம்' தலைமுறையை சேகரிக்க அடிக்கடி பயன்படுத்தப்படுகிறது.
4. தலைமுறை குப்பை சேகரிப்பு (Generational Garbage Collection)
இந்த அணுகுமுறை தலைமுறை கருதுகோளை (generational hypothesis) அடிப்படையாகக் கொண்டது, இது பெரும்பாலான பொருட்கள் மிகக் குறுகிய ஆயுட்காலம் கொண்டவை என்று கூறுகிறது. தலைமுறை GC நினைவகக் குவியலை பல தலைமுறைகளாகப் பிரிக்கிறது:
- இளம் தலைமுறை (Young Generation): புதிய பொருட்கள் ஒதுக்கப்படும் இடம். இங்கு GC சேகரிப்புகள் அடிக்கடி மற்றும் வேகமாக நடக்கும் (சிறு GCகள்).
- பழைய தலைமுறை (Old Generation): பல சிறு GC-க்களைத் தாங்கும் பொருட்கள் பழைய தலைமுறைக்கு உயர்த்தப்படுகின்றன. இங்கு GC சேகரிப்புகள் குறைவாகவும் மேலும் முழுமையாகவும் இருக்கும் (பெரிய GCகள்).
அது எப்படி வேலை செய்கிறது:
- புதிய பொருட்கள் இளம் தலைமுறையில் ஒதுக்கப்படுகின்றன.
- சிறு GCகள் (பெரும்பாலும் நகலெடுக்கும் சேகரிப்பாளரைப் பயன்படுத்தி) இளம் தலைமுறையில் அடிக்கடி செய்யப்படுகின்றன. தப்பிப்பிழைக்கும் பொருட்கள் பழைய தலைமுறைக்கு உயர்த்தப்படுகின்றன.
- பெரிய GCகள் பழைய தலைமுறையில் குறைவாகவே செய்யப்படுகின்றன, பெரும்பாலும் குறியிட்டு-துடைத்தல் அல்லது குறியிட்டு-சுருக்குதல் முறையைப் பயன்படுத்தி.
நன்மைகள்:
- மேம்பட்ட செயல்திறன்: முழு நினைவகக் குவியலையும் சேகரிக்கும் அதிர்வெண்ணை கணிசமாகக் குறைக்கிறது. பெரும்பாலான குப்பைகள் இளம் தலைமுறையில் காணப்படுகின்றன, இது விரைவாக சேகரிக்கப்படுகிறது.
- குறைந்த இடைநிறுத்த நேரங்கள்: சிறு GCகள் முழு நினைவகக் குவியல் GC-க்களை விட மிகவும் குறைவான நேரம் எடுக்கும்.
குறைகள்:
- சிக்கலான தன்மை: செயல்படுத்துவது மிகவும் சிக்கலானது.
- பதவி உயர்வுக்கான கூடுதல் செலவு: சிறு GC-க்களைத் தப்பிப் பிழைக்கும் பொருட்களுக்கு பதவி உயர்வுச் செலவு ஏற்படுகிறது.
- நினைவில் கொள்ளப்பட்ட தொகுப்புகள் (Remembered Sets): பழைய தலைமுறையிலிருந்து இளம் தலைமுறைக்கான பொருள் குறிப்புகளைக் கையாள, "நினைவில் கொள்ளப்பட்ட தொகுப்புகள்" தேவை, இது கூடுதல் செலவைச் சேர்க்கலாம்.
உதாரணம்: ஜாவா மெய்நிகர் இயந்திரம் (JVM) தலைமுறை GC-ஐ விரிவாகப் பயன்படுத்துகிறது (எ.கா., Throughput Collector, CMS, G1, ZGC போன்ற சேகரிப்பாளர்களுடன்).
5. குறிப்பு எண்ணிக்கை (Reference Counting)
சென்றடையக்கூடிய தன்மையைக் கண்டறிவதற்குப் பதிலாக, குறிப்பு எண்ணிக்கை ஒவ்வொரு பொருளுடனும் ஒரு எண்ணிக்கையை இணைக்கிறது, இது எத்தனை குறிப்புகள் அதைக் குறிப்பிடுகின்றன என்பதைக் குறிக்கிறது. ஒரு பொருளின் குறிப்பு எண்ணிக்கை பூஜ்ஜியமாகக் குறையும்போது அது குப்பையாகக் கருதப்படுகிறது.
- அதிகரித்தல்: ஒரு பொருளுக்கு ஒரு புதிய குறிப்பு செய்யப்படும்போது, அதன் குறிப்பு எண்ணிக்கை அதிகரிக்கப்படுகிறது.
- குறைத்தல்: ஒரு பொருளுக்கான குறிப்பு அகற்றப்படும்போது, அதன் எண்ணிக்கை குறைக்கப்படுகிறது. எண்ணிக்கை பூஜ்ஜியமானால், அந்த பொருள் உடனடியாக விடுவிக்கப்படுகிறது.
நன்மைகள்:
- இடைநிறுத்தங்கள் இல்லை: குறிப்புகள் கைவிடப்படும்போது படிப்படியாக விடுவிப்பு நடப்பதால், நீண்ட STW இடைநிறுத்தங்களைத் தவிர்க்கிறது.
- எளிமை: கருத்துரீதியாக நேராக உள்ளது.
குறைகள்:
- சுழற்சி குறிப்புகள் (Cyclic References): இதன் முக்கிய குறைபாடு சுழற்சி தரவு கட்டமைப்புகளை சேகரிக்க இயலாமை. பொருள் A, B-ஐக் குறித்தாலும், B மீண்டும் A-வைக் குறித்தாலும், வெளிப்புறக் குறிப்புகள் எதுவும் இல்லாவிட்டாலும், அவற்றின் குறிப்பு எண்ணிக்கை ஒருபோதும் பூஜ்ஜியத்தை அடையாது, இது நினைவகக் கசிவுகளுக்கு வழிவகுக்கிறது.
- கூடுதல் செலவு: ஒவ்வொரு குறிப்பு செயல்பாட்டிற்கும் எண்ணிக்கையை அதிகரிப்பதும் குறைப்பதும் கூடுதல் செலவைச் சேர்க்கிறது.
- கணிக்க முடியாத நடத்தை: குறிப்பு குறைப்புகளின் வரிசை கணிக்க முடியாததாக இருக்கலாம், இது நினைவகம் எப்போது மீட்டெடுக்கப்படுகிறது என்பதைப் பாதிக்கிறது.
உதாரணம்: Swift (ARC - Automatic Reference Counting), Python, மற்றும் Objective-C ஆகியவற்றில் பயன்படுத்தப்படுகிறது.
6. படிப்படியான குப்பை சேகரிப்பு (Incremental Garbage Collection)
STW இடைநிறுத்த நேரங்களை மேலும் குறைக்க, படிப்படியான GC வழிமுறைகள் GC வேலையை சிறிய துண்டுகளாகச் செய்கின்றன, GC செயல்பாடுகளை செயலி இயக்கத்துடன் கலக்கின்றன. இது இடைநிறுத்த நேரங்களைக் குறைவாக வைத்திருக்க உதவுகிறது.
- கட்டமைக்கப்பட்ட செயல்பாடுகள்: குறியிடுதல் மற்றும் துடைத்தல்/சுருக்குதல் கட்டங்கள் சிறிய படிகளாக பிரிக்கப்படுகின்றன.
- கலத்தல்: GC வேலை சுழற்சிகளுக்கு இடையில் செயலி நூல் இயங்க முடியும்.
நன்மைகள்:
- குறுகிய இடைநிறுத்தங்கள்: STW இடைநிறுத்தங்களின் கால அளவை கணிசமாகக் குறைக்கிறது.
- மேம்பட்ட மறுமொழித்திறன்: ஊடாடும் செயலிகளுக்கு சிறந்தது.
குறைகள்:
- சிக்கலான தன்மை: பாரம்பரிய வழிமுறைகளை விட செயல்படுத்த மிகவும் சிக்கலானது.
- செயல்திறன் கூடுதல் செலவு: GC மற்றும் செயலி நூல்களுக்கு இடையே ஒருங்கிணைப்பு தேவைப்படுவதால் சில கூடுதல் செலவை ஏற்படுத்தக்கூடும்.
உதாரணம்: பழைய JVM பதிப்புகளில் உள்ள Concurrent Mark Sweep (CMS) சேகரிப்பாளர், படிப்படியான சேகரிப்பின் ஒரு ஆரம்ப முயற்சியாகும்.
7. ஒரேநேர குப்பை சேகரிப்பு (Concurrent Garbage Collection)
ஒரேநேர GC வழிமுறைகள் தங்கள் பெரும்பாலான வேலைகளை செயலி நூல்களுடன் ஒரே நேரத்தில் செய்கின்றன. இதன் பொருள், GC நினைவகத்தைக் கண்டறிந்து மீட்டெடுக்கும்போது செயலி தொடர்ந்து இயங்குகிறது.
- ஒருங்கிணைக்கப்பட்ட வேலை: GC நூல்கள் மற்றும் செயலி நூல்கள் இணையாக செயல்படுகின்றன.
- ஒருங்கிணைப்பு வழிமுறைகள்: நிலைத்தன்மையை உறுதிப்படுத்த அதிநவீன வழிமுறைகள் தேவை, যেমন மூன்று-வண்ண குறியிடுதல் வழிமுறைகள் மற்றும் எழுதுதல் தடைகள் (செயலியால் செய்யப்படும் பொருள் குறிப்புகளில் ஏற்படும் மாற்றங்களைக் கண்காணிக்கும்).
நன்மைகள்:
- குறைந்தபட்ச STW இடைநிறுத்தங்கள்: மிகக் குறுகிய அல்லது "இடைநிறுத்தம் இல்லாத" செயல்பாட்டை நோக்கமாகக் கொண்டுள்ளது.
- அதிக செயல்திறன் மற்றும் மறுமொழித்திறன்: கடுமையான தாமதத் தேவைகள் உள்ள செயலிகளுக்கு சிறந்தது.
குறைகள்:
- சிக்கலான தன்மை: சரியாக வடிவமைத்து செயல்படுத்துவது மிகவும் சிக்கலானது.
- செயல்திறன் குறைப்பு: ஒரேநேர செயல்பாடுகள் மற்றும் ஒருங்கிணைப்பின் கூடுதல் செலவு காரணமாக சில நேரங்களில் ஒட்டுமொத்த செயலி செயல்திறனைக் குறைக்கலாம்.
- நினைவக கூடுதல் செலவு: மாற்றங்களைக் கண்காணிக்க கூடுதல் நினைவகம் தேவைப்படலாம்.
உதாரணம்: ஜாவாவில் G1, ZGC, மற்றும் Shenandoah போன்ற நவீன சேகரிப்பாளர்கள், மற்றும் Go மற்றும் .NET Core-ல் உள்ள GC ஆகியவை மிகவும் ஒரேநேரமானவை.
8. G1 (குப்பை-முதல்) சேகரிப்பாளர் (Garbage-First)
ஜாவா 7-ல் அறிமுகப்படுத்தப்பட்டு ஜாவா 9-ல் இயல்புநிலையாக மாறிய G1 சேகரிப்பாளர், ஒரு சர்வர்-பாணி, பகுதி-அடிப்படையிலான, தலைமுறை, மற்றும் ஒரேநேர சேகரிப்பாளர் ஆகும். இது செயல்திறன் மற்றும் தாமதத்தை சமநிலைப்படுத்த வடிவமைக்கப்பட்டுள்ளது.
- பகுதி-அடிப்படையிலான (Region-Based): நினைவகக் குவியலை பல சிறிய பகுதிகளாகப் பிரிக்கிறது. பகுதிகள் ஈடன், சர்வைவர், அல்லது பழையதாக இருக்கலாம்.
- தலைமுறை (Generational): தலைமுறை பண்புகளைப் பராமரிக்கிறது.
- ஒரேநேரம் & இணை (Concurrent & Parallel): செயலி நூல்களுடன் ஒரே நேரத்தில் பெரும்பாலான வேலைகளைச் செய்கிறது மற்றும் வெளியேற்றத்திற்கு (செயலில் உள்ள பொருட்களை நகலெடுப்பதற்கு) பல நூல்களைப் பயன்படுத்துகிறது.
- இலக்கு-சார்ந்தது (Goal-Oriented): பயனர் விரும்பிய இடைநிறுத்த நேர இலக்கைக் குறிப்பிட அனுமதிக்கிறது. G1 இந்த இலக்கை அடைய, அதிக குப்பை உள்ள பகுதிகளை முதலில் சேகரிப்பதன் மூலம் முயற்சிக்கிறது (எனவே "குப்பை-முதல்").
நன்மைகள்:
- சமநிலையான செயல்திறன்: பரந்த அளவிலான செயலிகளுக்கு நல்லது.
- கணிக்கக்கூடிய இடைநிறுத்த நேரங்கள்: பழைய சேகரிப்பாளர்களுடன் ஒப்பிடும்போது கணிசமாக மேம்பட்ட இடைநிறுத்த நேர கணிப்புத்திறன்.
- பெரிய நினைவகக் குவியல்களை நன்றாகக் கையாளுகிறது: பெரிய நினைவகக் குவியல் அளவுகளுடன் திறம்பட அளவிடுகிறது.
குறைகள்:
- சிக்கலான தன்மை: இயல்பாகவே சிக்கலானது.
- நீண்ட இடைநிறுத்தங்களுக்கான சாத்தியம்: இலக்கு இடைநிறுத்த நேரம் தீவிரமாகவும், நினைவகக் குவியல் செயலில் உள்ள பொருட்களுடன் மிகவும் துண்டாக்கப்பட்டும் இருந்தால், ஒரு ஒற்றை GC சுழற்சி இலக்கை மீறக்கூடும்.
உதாரணம்: பல நவீன ஜாவா செயலிகளின் இயல்புநிலை GC.
9. ZGC மற்றும் Shenandoah
இவை மிக சமீபத்திய, மேம்பட்ட குப்பை சேகரிப்பாளர்கள் ஆகும். இவை மிகக் குறைந்த இடைநிறுத்த நேரங்களுக்காக வடிவமைக்கப்பட்டுள்ளன, பெரும்பாலும் மிக பெரிய நினைவகக் குவியல்களில் (டெராபைட்கள்) கூட, துணை-மில்லி விநாடி இடைநிறுத்தங்களை இலக்காகக் கொண்டுள்ளன.
- சுமை-நேர சுருக்கம் (Load-Time Compaction): அவை செயலியுடன் ஒரே நேரத்தில் சுருக்கத்தை செய்கின்றன.
- மிகவும் ஒரேநேரமானவை (Highly Concurrent): கிட்டத்தட்ட அனைத்து GC வேலைகளும் ஒரே நேரத்தில் நடக்கும்.
- பகுதி-அடிப்படையிலானவை (Region-Based): G1 போன்ற ஒரு பகுதி-அடிப்படையிலான அணுகுமுறையைப் பயன்படுத்துகின்றன.
நன்மைகள்:
- மிகக் குறைந்த தாமதம் (Ultra-Low Latency): மிகக் குறுகிய, சீரான இடைநிறுத்த நேரங்களை நோக்கமாகக் கொண்டுள்ளது.
- அளவிடக்கூடிய தன்மை (Scalability): மிகப்பெரிய நினைவகக் குவியல்கள் உள்ள செயலிகளுக்கு சிறந்தது.
குறைகள்:
- செயல்திறன் பாதிப்பு: செயல்திறன் சார்ந்த சேகரிப்பாளர்களை விட சற்று அதிக CPU கூடுதல் செலவைக் கொண்டிருக்கலாம்.
- முதிர்ச்சி: ஒப்பீட்டளவில் புதியவை, இருப்பினும் வேகமாக முதிர்ச்சியடைந்து வருகின்றன.
உதாரணம்: ZGC மற்றும் Shenandoah சமீபத்திய OpenJDK பதிப்புகளில் கிடைக்கின்றன மற்றும் நிதி வர்த்தக தளங்கள் அல்லது உலகளாவிய பார்வையாளர்களுக்கு சேவை செய்யும் பெரிய அளவிலான வலை சேவைகள் போன்ற தாமத-உணர்திறன் கொண்ட செயலிகளுக்கு ஏற்றவை.
வெவ்வேறு இயங்குநேர சூழல்களில் குப்பை சேகரிப்பு
கொள்கைகள் உலகளாவியதாக இருந்தாலும், GC-யின் செயலாக்கம் மற்றும் நுணுக்கங்கள் வெவ்வேறு இயங்குநேர சூழல்களில் வேறுபடுகின்றன:
- ஜாவா மெய்நிகர் இயந்திரம் (JVM): வரலாற்று ரீதியாக, JVM GC கண்டுபிடிப்புகளின் முன்னணியில் உள்ளது. இது ஒரு செருகக்கூடிய GC கட்டமைப்பை வழங்குகிறது, டெவலப்பர்கள் தங்கள் செயலியின் தேவைகளைப் பொறுத்து பல்வேறு சேகரிப்பாளர்களிடமிருந்து (Serial, Parallel, CMS, G1, ZGC, Shenandoah) தேர்வு செய்ய அனுமதிக்கிறது. இந்த நெகிழ்வுத்தன்மை மாறுபட்ட உலகளாவிய வரிசைப்படுத்தல் சூழ்நிலைகளில் செயல்திறனை மேம்படுத்துவதற்கு முக்கியமானது.
- .NET பொது மொழி இயங்குநேரம் (CLR): .NET CLR-ம் ஒரு அதிநவீன GC-ஐக் கொண்டுள்ளது. இது தலைமுறை மற்றும் சுருக்கும் குப்பை சேகரிப்பு இரண்டையும் வழங்குகிறது. CLR GC பணிநிலைய பயன்முறையில் (கிளையன்ட் செயலிகளுக்கு உகந்தது) அல்லது சர்வர் பயன்முறையில் (பல-செயலி சர்வர் செயலிகளுக்கு உகந்தது) செயல்பட முடியும். இது இடைநிறுத்தங்களைக் குறைக்க ஒரேநேர மற்றும் பின்னணி குப்பை சேகரிப்பையும் ஆதரிக்கிறது.
- Go இயங்குநேரம்: Go நிரலாக்க மொழி ஒரு ஒரேநேர, மூன்று-வண்ண குறியிட்டு-துடைத்தல் குப்பை சேகரிப்பாளரைப் பயன்படுத்துகிறது. இது குறைந்த தாமதம் மற்றும் அதிக ஒருங்கியக்கத்திற்காக வடிவமைக்கப்பட்டுள்ளது, இது திறமையான ஒரேநேர அமைப்புகளை உருவாக்கும் Go-வின் தத்துவத்துடன் ஒத்துப்போகிறது. Go GC இடைநிறுத்தங்களை மிகக் குறுகியதாக, பொதுவாக மைக்ரோ விநாடிகள் வரிசையில் வைத்திருக்க நோக்கமாகக் கொண்டுள்ளது.
- ஜாவாஸ்கிரிப்ட் இயந்திரங்கள் (V8, SpiderMonkey): உலாவிகள் மற்றும் Node.js-ல் உள்ள நவீன ஜாவாஸ்கிரிப்ட் இயந்திரங்கள் தலைமுறை குப்பை சேகரிப்பாளர்களைப் பயன்படுத்துகின்றன. அவை குறியிட்டு-துடைத்தல் போன்ற நுட்பங்களைப் பயன்படுத்துகின்றன மற்றும் பயனர் இடைமுக ஊடாட்டங்களை மறுமொழியுடன் வைத்திருக்க பெரும்பாலும் படிப்படியான சேகரிப்பை இணைக்கின்றன.
சரியான GC வழிமுறையைத் தேர்ந்தெடுப்பது
பொருத்தமான GC வழிமுறையைத் தேர்ந்தெடுப்பது, செயலி செயல்திறன், அளவிடுதல் மற்றும் பயனர் அனுபவத்தைப் பாதிக்கும் ஒரு முக்கியமான முடிவாகும். அனைவருக்கும் பொருந்தக்கூடிய தீர்வு எதுவும் இல்லை. இந்த காரணிகளைக் கருத்தில் கொள்ளுங்கள்:
- செயலி தேவைகள்: உங்கள் செயலி தாமத-உணர்திறன் கொண்டதா (எ.கா., நிகழ்நேர வர்த்தகம், ஊடாடும் வலை சேவைகள்) அல்லது செயல்திறன் சார்ந்ததா (எ.கா., தொகுதி செயலாக்கம், அறிவியல் கணினி)?
- நினைவகக் குவியல் அளவு: மிக பெரிய நினைவகக் குவியல்களுக்கு (பத்து அல்லது நூற்றுக்கணக்கான ஜிகாபைட்கள்), அளவிடுதல் மற்றும் குறைந்த தாமதத்திற்காக வடிவமைக்கப்பட்ட சேகரிப்பாளர்கள் (G1, ZGC, Shenandoah போன்றவை) பெரும்பாலும் விரும்பப்படுகின்றன.
- ஒருங்கியக்கத் தேவைகள்: உங்கள் செயலிக்கு உயர் மட்ட ஒருங்கியக்கம் தேவையா? ஒரேநேர GC நன்மை பயக்கும்.
- மேம்பாட்டு முயற்சி: எளிமையான வழிமுறைகளைப் புரிந்துகொள்வது எளிதாக இருக்கலாம், ஆனால் பெரும்பாலும் செயல்திறன் சமரசங்களுடன் வருகின்றன. மேம்பட்ட சேகரிப்பாளர்கள் சிறந்த செயல்திறனை வழங்குகின்றன, ஆனால் மிகவும் சிக்கலானவை.
- இலக்குச் சூழல்: வரிசைப்படுத்தல் சூழலின் திறன்கள் மற்றும் வரம்புகள் (எ.கா., கிளவுட், உட்பொதிக்கப்பட்ட அமைப்புகள்) உங்கள் தேர்வைப் பாதிக்கலாம்.
GC மேம்படுத்தலுக்கான நடைமுறை குறிப்புகள்
சரியான வழிமுறையைத் தேர்ந்தெடுப்பதைத் தாண்டி, நீங்கள் GC செயல்திறனை மேம்படுத்தலாம்:
- GC அளவுருக்களை சரிசெய்தல்: பெரும்பாலான இயங்குநேரங்கள் GC அளவுருக்களை (எ.கா., நினைவகக் குவியல் அளவு, தலைமுறை அளவுகள், குறிப்பிட்ட சேகரிப்பாளர் விருப்பங்கள்) சரிசெய்ய அனுமதிக்கின்றன. இதற்கு பெரும்பாலும் சுயவிவரம் மற்றும் பரிசோதனை தேவைப்படுகிறது.
- பொருள் தொகுத்தல் (Object Pooling): தொகுத்தல் மூலம் பொருட்களை மீண்டும் பயன்படுத்துவது ஒதுக்கீடுகள் மற்றும் விடுவிப்புகளின் எண்ணிக்கையைக் குறைக்கலாம், அதன் மூலம் GC அழுத்தத்தைக் குறைக்கும்.
- தேவையற்ற பொருள் உருவாக்கத்தைத் தவிர்த்தல்: அதிக எண்ணிக்கையிலான குறுகிய காலப் பொருட்களை உருவாக்குவதில் கவனமாக இருங்கள், ஏனெனில் இது GC-க்கான வேலையை அதிகரிக்கும்.
- பலவீனமான/மென்மையான குறிப்புகளை புத்திசாலித்தனமாகப் பயன்படுத்துதல்: இந்த குறிப்புகள் நினைவகம் குறைவாக இருந்தால் பொருட்களை சேகரிக்க அனுமதிக்கின்றன, இது கேஷ்களுக்கு பயனுள்ளதாக இருக்கும்.
- உங்கள் செயலியை சுயவிவரம் செய்யுங்கள்: GC நடத்தையைப் புரிந்துகொள்ள, நீண்ட இடைநிறுத்தங்களைக் கண்டறிய, மற்றும் GC கூடுதல் செலவு அதிகமாக உள்ள பகுதிகளைக் கண்டறிய சுயவிவரக் கருவிகளைப் பயன்படுத்தவும். VisualVM, JConsole (ஜாவாவுக்கு), PerfView (.NET-க்கு), மற்றும் `pprof` (Go-க்கு) போன்ற கருவிகள் விலைமதிப்பற்றவை.
குப்பை சேகரிப்பின் எதிர்காலம்
இன்னும் குறைந்த தாமதங்கள் மற்றும் அதிக செயல்திறனை நோக்கிய தேடல் தொடர்கிறது. எதிர்கால GC ஆராய்ச்சி மற்றும் மேம்பாடு இவற்றில் கவனம் செலுத்த வாய்ப்புள்ளது:
- இடைநிறுத்தங்களை மேலும் குறைத்தல்: உண்மையான "இடைநிறுத்தம் இல்லாத" அல்லது "இடைநிறுத்தத்திற்கு அருகாமையில் இல்லாத" சேகரிப்பை நோக்கமாகக் கொண்டது.
- வன்பொருள் உதவி: வன்பொருள் எவ்வாறு GC செயல்பாடுகளுக்கு உதவ முடியும் என்பதை ஆராய்வது.
- AI/ML-இயக்கப்படும் GC: செயலி நடத்தை மற்றும் கணினி சுமைக்கு ஏற்ப GC உத்திகளை மாறும் வகையில் மாற்றியமைக்க இயந்திரக் கற்றலைப் பயன்படுத்துவதற்கான சாத்தியம்.
- இடைச்செயல்பாடு: வெவ்வேறு GC செயலாக்கங்கள் மற்றும் மொழிகளுக்கு இடையே சிறந்த ஒருங்கிணைப்பு மற்றும் இடைச்செயல்பாடு.
முடிவுரை
குப்பை சேகரிப்பு நவீன இயங்குநேர அமைப்புகளின் ஒரு மூலக்கல்லாகும், இது செயலிகள் சீராகவும் திறமையாகவும் இயங்குவதை உறுதிசெய்ய நினைவகத்தை அமைதியாக நிர்வகிக்கிறது. அடிப்படையான குறியிட்டு-துடைத்தல் முதல் மிகக் குறைந்த தாமதம் கொண்ட ZGC வரை, ஒவ்வொரு வழிமுறையும் நினைவக மேலாண்மையை மேம்படுத்துவதில் ஒரு பரிணாமப் படியைப் பிரதிபலிக்கிறது. உலகெங்கிலும் உள்ள டெவலப்பர்களுக்கு, இந்த நுட்பங்களைப் பற்றிய ஒரு திடமான புரிதல், மாறுபட்ட உலகளாவிய சூழல்களில் செழிக்கக்கூடிய, அதிக செயல்திறன் கொண்ட, அளவிடக்கூடிய மற்றும் நம்பகமான மென்பொருளை உருவாக்க அவர்களுக்கு அதிகாரம் அளிக்கிறது. சமரசங்களைப் புரிந்துகொண்டு சிறந்த நடைமுறைகளைப் பயன்படுத்துவதன் மூலம், அடுத்த தலைமுறை விதிவிலக்கான செயலிகளை உருவாக்க GC-யின் சக்தியை நாம் பயன்படுத்திக்கொள்ளலாம்.