কম্পিউটার

জাভাতে মেমরি লিক


জাভাতে, আবর্জনা সংগ্রহ (ধ্বংসকারীর কাজ) আবর্জনা সংগ্রহ ব্যবহার করে স্বয়ংক্রিয়ভাবে সম্পন্ন হয়। কিন্তু যদি এমন কিছু বস্তু থাকে যা কোডে তাদের উল্লেখ আছে? এটি ডি-অ্যালোকেট করা যাবে না, অর্থাৎ তাদের মেমরি সাফ করা যাবে না। যদি এমন পরিস্থিতি বারবার ঘটে এবং সৃষ্ট বা উল্লেখিত বস্তুগুলি একেবারেই ব্যবহার না করা হয় তবে সেগুলি অকেজো হয়ে যায়। এটিই মেমরি লিক নামে পরিচিত৷

মেমরির সীমা অতিক্রম করা হলে, প্রোগ্রামটি একটি ত্রুটি নিক্ষেপ করে বন্ধ হয়ে যায়, যেমন 'OutOfMemoryError'। এই কারণেই সর্বদা একটি বস্তুর সমস্ত রেফারেন্স মুছে ফেলার পরামর্শ দেওয়া হয় যাতে জাভা আবর্জনা সংগ্রাহক স্বয়ংক্রিয়ভাবে এটিকে ধ্বংস করতে পারে৷

নীচে একটি উদাহরণ দেওয়া হল যেটি ব্যাখ্যা করে যে কিভাবে কম্পাইলারটি স্থান ফুরিয়ে যায় যখন অত্যধিক মেমরি ব্যবহার করার চেষ্টা করা হয় -

উদাহরণ

import java.util.Vector;
public class Demo{
   public static void main(String[] args){
      Vector my_v1 = new Vector(314567);
      Vector my_v2 = new Vector(784324678);
      System.out.println("This is the last line to be printed");
   }
}

আউটপুট

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.base/java.util.Vector.<init>(Vector.java:142)
at java.base/java.util.Vector.<init>(Vector.java:155)
at Demo.main(Demo.java:7)

ডেমো নামের একটি ক্লাসে প্রধান ফাংশন রয়েছে যেখানে দুটি ভেক্টর অবজেক্টকে একটি স্থানের চেয়ে অনেক বড় নির্ধারণ করে তৈরি করা হয়েছে। শেষ মুদ্রণ লাইনটি কম্পাইলারটি সেই লাইনে পৌঁছেছে কিনা তা পরীক্ষা করার জন্য লেখা হয়েছে। বাস্তবে, এটি হয় না, যেহেতু এই ভেক্টরগুলির দ্বারা দখলকৃত স্থানটি বিশাল এবং এত বেশি মেমরি বরাদ্দ করা যায় না, ফলে একটি ত্রুটি হয়৷


  1. জাভাতে একটি সংগ্রহের থ্রেড কীভাবে নিরাপদ করবেন?

  2. জাভাতে স্ট্রিম করুন

  3. জাভাতে কোন সংগ্রহের ক্লাস থ্রেড-নিরাপদ?

  4. জাভাতে একটি প্রোগ্রাম দ্বারা ব্যবহৃত মেমরি কিভাবে পরীক্ষা করবেন?