সিরিয়াল জিসি
আবর্জনা সংগ্রহ স্তূপ থেকে রেফারেন্সহীন বস্তুগুলি সরিয়ে এবং নতুন তৈরি বস্তুর জন্য জায়গা তৈরি করে জাভাতে মেমরির দক্ষতা উন্নত করে।
জাভা ভার্চুয়াল মেশিনে আট ধরনের আবর্জনা সংগ্রহকারী রয়েছে। আসুন বিস্তারিতভাবে তাদের প্রতিটি বিবেচনা করা যাক।
সিরিয়াল GC হল সবচেয়ে সহজ GC বাস্তবায়ন। এটি একক-থ্রেডেড পরিবেশে চলমান ছোট অ্যাপ্লিকেশনের জন্য উদ্দিষ্ট। সমস্ত আবর্জনা সংগ্রহের ঘটনা একই থ্রেডে ক্রমানুসারে সম্পাদিত হয়। প্রতিটি আবর্জনা সংগ্রহের পরে কম্প্যাকশন করা হয়।
![সিরিয়াল জিসি](https://cdn.codegym.cc/images/article/3cbe67b6-3553-40cf-90a8-6df5080f300f/1024.jpeg)
সংগ্রাহক চালানোর ফলে একটি "ওয়ার্ল্ড স্টপ" ইভেন্ট হয়, যেখানে সম্পূর্ণ অ্যাপ্লিকেশন স্থগিত করা হয়। যেহেতু আবর্জনা সংগ্রহের সময় সম্পূর্ণ অ্যাপ্লিকেশনটি হিমায়িত হয়, তাই আপনি যদি বিলম্ব যতটা সম্ভব কম রাখতে চান তবে বাস্তব জীবনে এটি অবলম্বন করা উচিত নয়।
সিরিয়াল আবর্জনা সংগ্রহকারী ব্যবহার করার জন্য JVM যুক্তি হল -XX:+UseSerialGC ।
সমান্তরাল জিসি
সমান্তরাল আবর্জনা সংগ্রাহকটি মাঝারি থেকে বড় ডেটা সেট সহ অ্যাপ্লিকেশনগুলির জন্য ডিজাইন করা হয়েছে যা মাল্টিথ্রেডেড বা মাল্টিপ্রসেসর হার্ডওয়্যারে চলে। এটি ডিফল্ট GC বাস্তবায়ন এবং এটি থ্রুপুট সংগ্রাহক হিসাবেও পরিচিত।
তরুণ প্রজন্মের মধ্যে ছোট আবর্জনা সংগ্রহের জন্য বেশ কয়েকটি সুতো নির্ধারিত হয়েছে। পুরোনো প্রজন্মের মূল আবর্জনা সংগ্রহ নিয়ে ব্যস্ত একমাত্র থ্রেড।
![সমান্তরাল জিসি](https://cdn.codegym.cc/images/article/9253feb3-a0e1-4ef0-9696-25926c18df42/1024.jpeg)
একটি সমান্তরাল GC চালানোর ফলে বিশ্ব "থেমে যায়" এবং অ্যাপ্লিকেশনটি হ্যাং হয়ে যায়। এই আচরণটি একটি মাল্টি-থ্রেডেড পরিবেশের জন্য আরও উপযুক্ত যেখানে অনেকগুলি কাজ সম্পূর্ণ করতে হবে এবং দীর্ঘ বিরতি গ্রহণযোগ্য, যেমন একটি ব্যাচ কাজ চালানোর সময়।
সমান্তরাল আবর্জনা সংগ্রহকারী ব্যবহার করার জন্য JVM যুক্তি হল -XX:+UseParallelGC ।
সিএমএস জিসি
আমাদের কাছে নিম্ন বিশ্রাম সমান্তরাল বাছাইকারী হিসাবেও পরিচিত ।
এখানে, একটি ছোট আবর্জনা সংগ্রহের জন্য, বেশ কয়েকটি থ্রেড জড়িত, এটি সমান্তরাল সংগ্রাহকের মতো একই অ্যালগরিদমের মাধ্যমে ঘটে। প্রধান আবর্জনা সংগ্রহটি বহু-থ্রেডেড, পুরানো সমান্তরাল GC-এর মতোই, কিন্তু CMS "ওয়ার্ল্ড স্টপ" ইভেন্টগুলিকে কম করার জন্য অ্যাপ্লিকেশন প্রক্রিয়াগুলির সাথে একযোগে চলে।
![সিএমএস জিসি](https://cdn.codegym.cc/images/article/ba41fb23-bd47-4051-8264-a95a9c9849ad/1024.jpeg)
এই কারণে, CMS সংগ্রাহক অন্যান্য সংগ্রাহকদের তুলনায় বেশি CPU ব্যবহার করে। কর্মক্ষমতা উন্নত করতে আপনার যদি আরও বেশি সিপিইউ বরাদ্দ করার ক্ষমতা থাকে, তাহলে একটি সিএমএস একটি সাধারণ সমান্তরাল সংগ্রাহকের চেয়ে পছন্দনীয়। CMS GC কমপ্যাক্ট করে না।
সমান্তরাল মার্ক-সুইপ আবর্জনা সংগ্রাহক ব্যবহার করার জন্য JVM যুক্তি হল -XX:+UseConcMarkSweepGC ।
G1 (আবর্জনা প্রথমে) GC
G1GC কে CMS-এর প্রতিস্থাপন হিসাবে কল্পনা করা হয়েছিল এবং বহু-থ্রেডেড অ্যাপ্লিকেশনগুলির জন্য তৈরি করা হয়েছিল যেগুলি বড় স্তূপের আকার (4 গিগাবাইটের বেশি) দ্বারা চিহ্নিত করা হয়েছে। এটি একটি CMS-এর মতো সমান্তরাল এবং প্রতিযোগিতামূলক, কিন্তু হুডের নীচে এটি পুরানো আবর্জনা সংগ্রহকারীদের থেকে খুব আলাদাভাবে কাজ করে।
যদিও G1 প্রজন্মগত ভিত্তিতেও কাজ করে, তবে এটিতে তরুণ এবং বয়স্ক প্রজন্মের জন্য আলাদা স্থান নেই। পরিবর্তে, প্রতিটি প্রজন্ম হল অঞ্চলগুলির একটি সেট, যা তরুণ প্রজন্মের আকার পরিবর্তন করার ক্ষেত্রে নমনীয়তার অনুমতি দেয়।
G1 হিপটিকে সমান আকারের অঞ্চলগুলির একটি সেটে বিভক্ত করে (স্তূপের আকারের উপর নির্ভর করে) এবং সেগুলিকে একাধিক থ্রেডে স্ক্যান করে। প্রোগ্রামটি সম্পাদনের সময় এলাকাটি বারবার বৃদ্ধ এবং তরুণ উভয়ই হয়ে উঠতে পারে।
মার্কআপ পর্ব সম্পূর্ণ হওয়ার পরে, G1 জানে কোন এলাকায় সবচেয়ে বেশি আবর্জনা রয়েছে। ব্যবহারকারী যদি বিরতি কমাতে আগ্রহী হন, G1 শুধুমাত্র কয়েকটি এলাকা নির্বাচন করতে পারে। যদি বিরতির সময় ব্যবহারকারীর কাছে গুরুত্বপূর্ণ না হয়, বা যদি বিরতির সময়সীমা উচ্চ সেট করা হয়, G1 আরও বেশি এলাকা অতিক্রম করবে।
যেহেতু G1 GC সর্বাধিক আবর্জনাযুক্ত অঞ্চলগুলিকে চিহ্নিত করে এবং সেই অঞ্চলগুলিতে প্রথমে আবর্জনা সংগ্রহ করে, এটিকে "আবর্জনা প্রথম" বলা হয়।
![](https://cdn.codegym.cc/images/article/a2c26fd4-2e6b-4d2c-a646-473db59d44a6/800.jpeg)
ইডেন, সারভাইভারস এবং ওল্ড মেমোরির অঞ্চলগুলি ছাড়াও, G1GC-তে আরও দুটি প্রকার রয়েছে।
- Humongous (বিশাল) - বড় আকারের বস্তুর জন্য (স্তূপের আকারের 50% এর বেশি)।
- উপলব্ধ - অব্যবহৃত বা অনির্ধারিত স্থান।
G1 আবর্জনা সংগ্রহকারী ব্যবহার করার জন্য JVM যুক্তি হল -XX:+UseG1GC ।
শেনান্দোহ (শানদারা)
Shenandoah হল JDK 12-এর অংশ হিসাবে প্রকাশিত একটি নতুন GC। G1-এর তুলনায় Shenandoah-এর মূল সুবিধা হল যে বেশিরভাগ আবর্জনা সংগ্রহের চক্র একই সাথে অ্যাপ্লিকেশন থ্রেডের সাথে সম্পন্ন হয়। যখন অ্যাপ্লিকেশনটি স্থগিত করা হয় তখন G1 শুধুমাত্র স্তূপ এলাকাগুলিকে খালি করতে পারে, যখন Shenandoah অ্যাপ্লিকেশনটির মতো একই সময়ে বস্তুগুলিকে সরিয়ে দেয়।
Shenandoah লাইভ অবজেক্ট কমপ্যাক্ট করতে পারে, আবর্জনা পরিষ্কার করতে পারে এবং ফ্রি মেমরি পাওয়া মাত্রই RAM খালি করতে পারে। যেহেতু এই সব একই সময়ে ঘটে, অ্যাপ্লিকেশন স্থগিত না করে, Shenandoah আরো CPU নিবিড়।
ZGC
ZGC হল আরেকটি GC JDK 11-এর অংশ হিসেবে প্রকাশিত এবং JDK 12-এ উন্নত হয়েছে।
এটি এমন অ্যাপ্লিকেশানগুলির জন্য উদ্দিষ্ট যেগুলির জন্য গতি এবং কম বিলম্ব (10 ms এর কম বিরতি) এবং/অথবা একটি খুব বড় স্তূপ (বেশ কিছু টেরাবাইট) ব্যবহার করা প্রয়োজন৷
ZGC-এর প্রধান লক্ষ্য হল কম লেটেন্সি, স্কেলেবিলিটি এবং ব্যবহারের সহজতা। এটি করার জন্য, এটি জাভা অ্যাপ্লিকেশনটিকে আবর্জনা সংগ্রহের কার্যক্রম চলমান থাকা সত্ত্বেও চালিয়ে যেতে দেয়। ডিফল্টরূপে, ZGC অব্যবহৃত মেমরি প্রকাশ করে এবং অপারেটিং সিস্টেমে ফেরত দেয়।
এইভাবে, ZGC অত্যন্ত কম ডেড টাইম প্রদান করে (সাধারণত 2ms এর মধ্যে) অন্যান্য ঐতিহ্যবাহী GC-এর তুলনায় উল্লেখযোগ্য উন্নতি এনেছে।
![ZGC এর প্রধান উদ্দেশ্য](https://cdn.codegym.cc/images/article/3ca77686-5b92-46ad-ab67-f8623caa9c71/512.jpeg)
ZGC আবর্জনা সংগ্রহকারী ব্যবহার করার জন্য JVM যুক্তি হল -XX:+UnlockExperimentalVMOptions -XX:+UseZGC ।
GO TO FULL VERSION