যখনই আমরা একটি জাভা প্রোগ্রাম চালাই, অপারেটিং সিস্টেম JVM-এ কিছু মেমরি বরাদ্দ করে। JVM এই মেমরিকে দুই ভাগে ভাগ করে। একটি স্ট্যাক মেমরি এবং আরেকটি হিপ মেমরি। একটি স্ট্যাক পদ্ধতি কার্যকর করার জন্য ব্যবহার করা হয় এবং বস্তুগুলি সংরক্ষণ করতে হিপ ব্যবহার করা হয়। যখন স্ট্যাক পূর্ণ হয়ে যায়, JVM java.lang.StackOverflowError ছুঁড়ে দেয় এবং যখন স্তূপ পূর্ণ হয়ে যায়, JVM java.lang.OutOfMemoryError নিক্ষেপ করে।
StackOverflowError
- পদ্ধতি কার্যকর করার জন্য একটি স্ট্যাক ব্যবহার করা হয়। প্রতিটি মেথড কলের জন্য, স্ট্যাক মেমরিতে একটি ব্লক তৈরি করা হয়
- প্যারামিটার, লোকাল ভেরিয়েবল বা অবজেক্টের রেফারেন্সের মতো পদ্ধতি সম্পর্কিত ডেটা এই ব্লকে সংরক্ষণ করা হয়।
- যখন পদ্ধতিটি তার কার্য সম্পাদন শেষ করে, তখন এই ব্লকটি স্ট্যাক থেকে সঞ্চিত ডেটা সহ সরানো হয়৷
- যখনই আমরা একটি পদ্ধতিকে কল করি, তখনই এটির কার্য সম্পাদন শেষ করতে হবে এবং স্ট্যাক মেমরি ছেড়ে যেতে হবে৷
- যদি পদ্ধতিগুলি স্ট্যাকের মধ্যে থাকে তাহলে স্ট্যাকটি পূর্ণ হবে এবং JVM java.lang.StackOverflowError নিক্ষেপ করবে।
OutOfMemoryError
- জাভাতে আমরা যে অবজেক্ট তৈরি করেছি তা হিপ মেমরিতে সংরক্ষিত থাকে। যখন বস্তুর আর প্রয়োজন হয় না, সেগুলিকে অবশ্যই মেমরি থেকে মুছে ফেলতে হবে।
- আবর্জনা সংগ্রাহক গাদা মেমরি থেকে অবাঞ্ছিত বস্তুগুলি সরিয়ে দেয়।
- আমাদের বস্তুর লাইভ রেফারেন্স থাকলে, আবর্জনা সংগ্রহকারী সেগুলি সরিয়ে দেয় না। এটি শুধুমাত্র সেই বস্তুগুলিকে সরিয়ে দেয় যার লাইভ রেফারেন্স নেই৷
- যখনই আমরা একটি পদ্ধতিকে কল করি, তখনই এটির কার্য সম্পাদন শেষ করতে হবে এবং স্ট্যাক মেমরি ছেড়ে যেতে হবে৷
- যদি হিপ মেমরিতে নতুন বস্তুর জন্য কোনো স্থান অবশিষ্ট না থাকে তাহলে JVM java.lang.OutOfMemoryError নিক্ষেপ করবে।