কম্পিউটার টিউটোরিয়াল

জাভাতে মেমরি লিক (Memory Leaks)


জাভাতে গার্বেজ কলেকশন (ডিসট্রাক্টরের কাজ) অটোমেটিক্যালি গার্বেজ কলেকশন ব্যবহার করে করা হয়। কিন্তু যদি কোডে এমন অবজেক্ট থাকে যাদের রেফারেন্স থাকে? সেগুলো ডি-অ্যালোকেট করা যায় না, অর্থাৎ তাদের মেমরি ক্লিয়ার করা যায় না। যদি এ soumis ঘটনা বারবার ঘটে এবং তৈরি বা রেফারেন্স করা অবজেক্টগুলো যেন কোনো কাজে লাগে না, তবে সেগুলো বেকarja হয়ে যায়। इसी কে মেমরি লিক বলা হয়।

যদি মেমরি লিমিট অতিক্রম করে, প্রোগ্রামটি একটি এরর থ্রো করে টার্মিনেট হয়, অর্থাৎ '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)

Demo ক্লাসে main ফাংশন আছে যেখানে দুটি ভেক্টর অবজেক্ট খুব বড় স্পেস অ্যালোকেট করে তৈরি করা হয়েছে। শেষের প্রিন্ট লাইনটি শুধু চেক করার জন্য লেখা হয়েছে যে কম্পাইলার সে লাইন পর্যন্ত পৌঁছাচ্ছে কিনা। বাস্তবে, সেটি পৌঁছায় না, কারণ এই ভেক্টরها যে অর্থépisode স্পেস দখল করেছে, তত বেশি মেমরি অ্যালোকেট করা সম্ভব না, ফলে এরর হয়।

  1. জাভাতে কালেকশনকে থ্রেড-সেফ কীভাবে করবেন?

  2. জাভাতে Stream

  3. জাভাতে কোন কালেকশন ক্লাসগুলো থ্রেড-সেফ

  4. জাভাতে প্রোগ্রামের মেমরি ব্যবহার চেক করা