JVM এ মেমরি বোঝা

আপনি ইতিমধ্যেই জানেন, JVM জাভা প্রোগ্রামগুলিকে নিজের মধ্যেই চালায়। যেকোনো ভার্চুয়াল মেশিনের মতো, এর নিজস্ব মেমরি অর্গানাইজেশন সিস্টেম রয়েছে।

অভ্যন্তরীণ মেমরি লেআউট নির্দেশ করে কিভাবে আপনার জাভা অ্যাপ্লিকেশন কাজ করে। এইভাবে, অ্যাপ্লিকেশন এবং অ্যালগরিদমগুলির অপারেশনে বাধাগুলি চিহ্নিত করা যেতে পারে। দেখা যাক এটা কিভাবে কাজ করে।

JVM এ মেমরি বোঝা

গুরুত্বপূর্ণ ! আসল জাভা মডেলটি যথেষ্ট ভাল ছিল না, তাই এটি জাভা 1.5 এ সংশোধন করা হয়েছিল। এই সংস্করণটি আজ পর্যন্ত ব্যবহার করা হয়েছে (জাভা 14+)।

থ্রেড স্ট্যাক

JVM দ্বারা অভ্যন্তরীণভাবে ব্যবহৃত জাভা মেমরি মডেল মেমরিকে থ্রেড স্ট্যাক এবং স্তূপে ভাগ করে। যৌক্তিকভাবে ব্লকে বিভক্ত জাভা মেমরি মডেলটি দেখুন:

থ্রেড স্ট্যাক

JVM-এ চলমান সমস্ত থ্রেডের নিজস্ব স্ট্যাক রয়েছে । স্ট্যাক, ঘুরে, থ্রেড কোন পদ্ধতি কল করেছে সে সম্পর্কে তথ্য ধারণ করে। আমি এটিকে "কল স্ট্যাক" বলব। থ্রেড কোডটি কার্যকর করার সাথে সাথে কল স্ট্যাক পুনরায় শুরু হয়।

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

আদিম প্রকারের সমস্ত স্থানীয় ভেরিয়েবল ( বুলিয়ান , বাইট , শর্ট , char , int , long , float , double ) সম্পূর্ণরূপে থ্রেড স্ট্যাকের মধ্যে সংরক্ষণ করা হয় এবং অন্যান্য থ্রেডগুলিতে দৃশ্যমান নয়। একটি থ্রেড একটি আদিম ভেরিয়েবলের একটি অনুলিপি অন্য থ্রেডে পাঠাতে পারে, কিন্তু একটি আদিম স্থানীয় পরিবর্তনশীল ভাগ করতে পারে না।

গাদা

হিপটিতে আপনার অ্যাপ্লিকেশনে তৈরি করা সমস্ত বস্তু রয়েছে, কোন থ্রেড বস্তুটি তৈরি করেছে তা নির্বিশেষে। এর মধ্যে রয়েছে আদিম প্রকারের মোড়ক (উদাহরণস্বরূপ, বাইট , পূর্ণসংখ্যা , দীর্ঘ , এবং আরও অনেক কিছু)। বস্তুটি তৈরি করা হয়েছে এবং একটি স্থানীয় ভেরিয়েবলকে বরাদ্দ করা হয়েছে বা অন্য বস্তুর সদস্য ভেরিয়েবল হিসাবে তৈরি করা হয়েছে তা কোন ব্যাপার না, এটি হিপে সংরক্ষণ করা হয়।

নীচে একটি ডায়াগ্রাম রয়েছে যা কল স্ট্যাক এবং স্থানীয় ভেরিয়েবল (এগুলি স্ট্যাকের উপর সংরক্ষণ করা হয়) পাশাপাশি বস্তুগুলিকে (তারা স্তূপে সংরক্ষিত) চিত্রিত করে:

গাদা

যে ক্ষেত্রে স্থানীয় ভেরিয়েবলটি একটি আদিম প্রকারের, এটি থ্রেডের স্ট্যাকের উপর সংরক্ষণ করা হয়।

একটি স্থানীয় পরিবর্তনশীল একটি বস্তুর একটি রেফারেন্স হতে পারে. এই ক্ষেত্রে, রেফারেন্স (স্থানীয় ভেরিয়েবল) থ্রেড স্ট্যাকের উপর সংরক্ষণ করা হয়, কিন্তু বস্তুটি নিজেই স্তূপে সংরক্ষিত হয়।

একটি বস্তুর পদ্ধতি রয়েছে, এই পদ্ধতিতে স্থানীয় ভেরিয়েবল রয়েছে। এই স্থানীয় ভেরিয়েবলগুলি থ্রেড স্ট্যাকেও সংরক্ষণ করা হয়, এমনকি যদি পদ্ধতিটির মালিক বস্তুটি হিপে সংরক্ষণ করা হয়।

বস্তুর সদস্য ভেরিয়েবলগুলি বস্তুর সাথেই হিপে সংরক্ষণ করা হয়। যখন সদস্য ভেরিয়েবলটি একটি আদিম প্রকারের হয় এবং যখন এটি একটি অবজেক্ট রেফারেন্স হয় উভয় ক্ষেত্রেই এটি সত্য।

স্ট্যাটিক ক্লাস ভেরিয়েবলগুলিও ক্লাস সংজ্ঞা সহ হিপে সংরক্ষণ করা হয়।

বস্তুর সাথে মিথস্ক্রিয়া

বস্তুর রেফারেন্স আছে এমন সমস্ত থ্রেড দ্বারা গাদা উপর অবজেক্ট অ্যাক্সেস করা যেতে পারে। যদি একটি থ্রেডের একটি বস্তুর অ্যাক্সেস থাকে, তাহলে এটি বস্তুর ভেরিয়েবল অ্যাক্সেস করতে পারে। যদি দুটি থ্রেড একই সময়ে একই বস্তুতে একটি পদ্ধতি কল করে, তবে তারা উভয়েরই অবজেক্টের সদস্য ভেরিয়েবলগুলিতে অ্যাক্সেস থাকবে, তবে প্রতিটি থ্রেডের স্থানীয় ভেরিয়েবলের নিজস্ব অনুলিপি থাকবে।

বস্তুর সাথে মিথস্ক্রিয়া (গাদা)

দুটি থ্রেডে স্থানীয় ভেরিয়েবলের একটি সেট রয়েছে।স্থানীয় পরিবর্তনশীল 2স্তূপে একটি ভাগ করা বস্তুর দিকে নির্দেশ করে (অবজেক্ট 3) প্রতিটি থ্রেডের নিজস্ব রেফারেন্স সহ স্থানীয় ভেরিয়েবলের নিজস্ব অনুলিপি রয়েছে। তাদের রেফারেন্সগুলি স্থানীয় ভেরিয়েবল এবং তাই থ্রেড স্ট্যাকগুলিতে সংরক্ষণ করা হয়। যাইহোক, দুটি ভিন্ন রেফারেন্স স্তূপে একই বস্তুকে নির্দেশ করে।

উল্লেখ্য যে জেনারেল ডঅবজেক্ট 3লিঙ্ক আছেঅবজেক্ট 2এবংঅবজেক্ট 4সদস্য ভেরিয়েবল হিসাবে (তীর দ্বারা দেখানো হয়েছে)। এই লিঙ্কগুলির মাধ্যমে, দুটি থ্রেড অ্যাক্সেস করতে পারেঅবজেক্ট 2এবংঅবজেক্ট4.

চিত্রটি একটি স্থানীয় পরিবর্তনশীলও দেখায় (স্থানীয় পরিবর্তনশীল 1পদ্ধতি দুই থেকে )। এর প্রতিটি অনুলিপিতে আলাদা আলাদা রেফারেন্স রয়েছে যা দুটি ভিন্ন বস্তুকে নির্দেশ করে (অবজেক্ট 1এবংঅবজেক্ট 5) এবং একই নয়। তাত্ত্বিকভাবে, উভয় থ্রেড উভয়ই অ্যাক্সেস করতে পারেঅবজেক্ট 1, তাই থেকেঅবজেক্ট 5যদি তাদের কাছে এই দুটি বস্তুর উল্লেখ থাকে। কিন্তু উপরের চিত্রে, প্রতিটি থ্রেডে শুধুমাত্র দুটি বস্তুর একটির উল্লেখ রয়েছে।

বস্তুর সাথে মিথস্ক্রিয়া একটি উদাহরণ

আসুন দেখি কিভাবে আমরা কোডে কাজটি প্রদর্শন করতে পারি:

public class MySomeRunnable implements Runnable() {

    public void run() {
        one();
    }

    public void one() {
        int localOne = 1;

        Shared localTwo = Shared.instance;

        //... do something with local variables

        two();
    }

    public void two() {
        Integer localOne = 2;

        //... do something with local variables
    }
}
public class Shared {

    // store an instance of our object in a variable

    public static final Shared instance = new Shared();

    // member variables pointing to two objects on the heap

    public Integer object2 = new Integer(22);
    public Integer object4 = new Integer(44);
}

run() মেথডটি এক() মেথডকে কল করে এবং এক() পালাক্রমে দুই() কল করে ।

one() পদ্ধতিটি একটি আদিম স্থানীয় পরিবর্তনশীল ঘোষণা করে (স্থানীয় এক) টাইপ int এবং একটি স্থানীয় পরিবর্তনশীল (স্থানীয় দুই), যা একটি বস্তুর একটি রেফারেন্স।

প্রতিটি থ্রেড এক() পদ্ধতি কার্যকর করে তার নিজস্ব অনুলিপি তৈরি করবেস্থানীয় একএবংস্থানীয় দুইআপনার স্ট্যাকের মধ্যে ভেরিয়েবলস্থানীয় একপ্রতিটি থ্রেডের স্ট্যাকের উপর থাকা অবস্থায় একে অপরের থেকে সম্পূর্ণ আলাদা হয়ে যাবে। একটি থ্রেড অন্য থ্রেড এর অনুলিপিতে কী পরিবর্তন করে তা দেখতে পারে নাস্থানীয় এক.

প্রতিটি থ্রেড one() পদ্ধতিটি কার্যকর করে তার নিজস্ব অনুলিপি তৈরি করেস্থানীয় দুই. তবে দুটি ভিন্ন কপিস্থানীয় দুইশেষ পর্যন্ত গাদা উপর একই বস্তু নির্দেশ করে. ব্যাপারটি হলোস্থানীয় দুইস্ট্যাটিক ভেরিয়েবল দ্বারা উল্লেখ করা বস্তুর দিকে নির্দেশ করেদৃষ্টান্ত. একটি স্ট্যাটিক ভেরিয়েবলের একটি মাত্র কপি আছে এবং সেই কপিটি হিপে সংরক্ষিত আছে।

তাই উভয় কপিস্থানীয় দুইশেষ পর্যন্ত একই ভাগ করা উদাহরণের দিকে নির্দেশ করে । শেয়ার্ড ইনস্ট্যান্সটি হিপেও সংরক্ষিত থাকে। এটা মিলেছেঅবজেক্ট 3উপরের চিত্রে।

উল্লেখ্য, শেয়ার্ড ক্লাসে দুটি সদস্য ভেরিয়েবলও রয়েছে। সদস্য ভেরিয়েবলগুলি নিজেরাই বস্তুর সাথে স্তূপে সংরক্ষণ করা হয়। দুটি সদস্য ভেরিয়েবল অন্য দুটি বস্তুর দিকে নির্দেশ করেপূর্ণসংখ্যা. এই পূর্ণসংখ্যা বস্তু অনুরূপঅবজেক্ট 2এবংঅবজেক্ট 4ডায়াগ্রামে

এছাড়াও নোট করুন যে two() পদ্ধতি একটি স্থানীয় ভেরিয়েবল তৈরি করেস্থানীয় এক. এই স্থানীয় পরিবর্তনশীলটি Integer টাইপের একটি বস্তুর একটি রেফারেন্স । পদ্ধতিটি লিঙ্ক সেট করেস্থানীয় একএকটি নতুন পূর্ণসংখ্যা উদাহরণ নির্দেশ করতে । লিঙ্কটি তার অনুলিপিতে সংরক্ষণ করা হবেস্থানীয় একপ্রতিটি থ্রেডের জন্য। দুটি পূর্ণসংখ্যার দৃষ্টান্ত হিপে সংরক্ষণ করা হবে, এবং যেহেতু পদ্ধতিটি প্রতিবার কার্যকর করার সময় একটি নতুন পূর্ণসংখ্যা বস্তু তৈরি করে, এই পদ্ধতিটি কার্যকর করা দুটি থ্রেড পৃথক পূর্ণসংখ্যা দৃষ্টান্ত তৈরি করবে । তারা মেলেঅবজেক্ট 1এবংঅবজেক্ট 5উপরের চিত্রে।

শেয়ার্ড ক্লাস টাইপের পূর্ণসংখ্যার দুটি সদস্য ভেরিয়েবলের দিকেও লক্ষ্য করুন , যা একটি আদিম প্রকার। যেহেতু এই ভেরিয়েবলগুলি সদস্য ভেরিয়েবল, সেগুলি এখনও অবজেক্টের সাথে হিপে সংরক্ষণ করা হয়। থ্রেড স্ট্যাকে শুধুমাত্র স্থানীয় ভেরিয়েবল সংরক্ষণ করা হয়।