আদিম ক্ষেত্রগুলি কোথায় সংরক্ষণ করা হয়?
আদিম ক্ষেত্রগুলি কোথাও তাত্ক্ষণিকভাবে অবজেক্টের অংশ হিসাবে সংরক্ষণ করা হয় । এটি কোথায় - তা ভাবার সবচেয়ে সহজ উপায় হ'ল গাদা। তবে , এটি সবসময় হয় না। জাভা তত্ত্ব এবং অনুশীলনে বর্ণিত হিসাবে : নগর কর্মক্ষেত্রের কিংবদন্তি, পুনর্বিবেচিত :
জেভিএমগুলি এস্কেপ অ্যানালাইসিস নামে একটি কৌশল ব্যবহার করতে পারে, যার মাধ্যমে তারা বলতে পারে যে নির্দিষ্ট কিছু বস্তু তাদের পুরো জীবনকালের জন্য একক থ্রেডের মধ্যে সীমাবদ্ধ থাকে এবং সেই আজীবন একটি নির্দিষ্ট স্ট্যাক ফ্রেমের জীবনকাল দ্বারা আবদ্ধ থাকে। এই জাতীয় অবজেক্টগুলি গাদাের পরিবর্তে স্ট্যাকের মধ্যে নিরাপদে বরাদ্দ করা যেতে পারে। আরও ভাল, ছোট বস্তুর জন্য, জেভিএম সম্পূর্ণ বরাদ্দটি অপ্টিমাইজ করতে পারে এবং কেবলমাত্র অবজেক্টের ক্ষেত্রগুলিকে নিবন্ধগুলিতে উত্তোলন করতে পারে।
সুতরাং, "অবজেক্টটি তৈরি হয় এবং ক্ষেত্রটিও সেখানে রয়েছে" বলার বাইরে কিছু গাদা বা স্ট্যাকের উপর থাকলে কেউ বলতে পারে না। মনে রাখবেন যে ছোট, স্বল্প জীবিত অবজেক্টের জন্য এটি সম্ভবত সম্ভব যে 'বস্তু' স্মৃতিতে উপস্থিত থাকবে না এবং এর পরিবর্তে এর ক্ষেত্রগুলি সরাসরি রেজিস্টারগুলিতে স্থাপন করা যেতে পারে।
কাগজটি দিয়ে শেষ হয়েছে:
JVM গুলি আশ্চর্যজনকভাবে এমন জিনিসগুলি নির্ধারণ করতে পারে যা আমরা ধরে নিই যে কেবল বিকাশকারীই জানতে পারে। জেভিএম কেস-কেস-কেস ভিত্তিতে স্ট্যাক বরাদ্দ এবং হিপ বরাদ্দের মধ্যে চয়ন করতে দিয়ে আমরা প্রোগ্রামারটিকে স্ট্যাকের বা স্তূপে বরাদ্দ দেওয়ার বিষয়ে উদ্বেগ তৈরি না করে স্ট্যাক বরাদ্দের পারফরম্যান্স সুবিধা পেতে পারি।
সুতরাং, আপনার কাছে এমন কোড রয়েছে যা দেখতে দেখতে:
void foo(int arg) {
Bar qux = new Bar(arg);
...
}
যেখানে সুযোগটি ছাড়তে ...
দেয় না qux
, তার পরিবর্তে স্ট্যাকের জন্য বরাদ্দ দেওয়া qux
যেতে পারে। এটি আসলে ভিএম এর জন্য একটি জয় কারণ এর অর্থ এটি কখনই আবর্জনা সংগ্রহ করার দরকার নেই - সুযোগ ছাড়লে এটি অদৃশ্য হয়ে যায়।
উইকিপিডিয়ায় পালানোর বিশ্লেষণ সম্পর্কিত আরও কিছু । যাঁরা কাগজপত্রগুলি সন্ধান করতে ইচ্ছুক তাদের জন্য, আইবিএম থেকে জাভা জন্য এসেসেপিস বিশ্লেষণ । একটি সি # বিশ্ব থেকে আগতদের জন্য, আপনি স্ট্যাকটি একটি বাস্তবায়ন বিশদ এবং এরিক লিপার্ট দ্বারা মূল্য প্রকারের সত্য সম্পর্কে ভাল পঠনগুলি পেতে পারেন (এগুলি জাভা ধরণের জন্যও কার্যকর কারণ অনেকগুলি ধারণা এবং দিকগুলি একই বা অনুরূপ) । নেট বইগুলি স্ট্যাক বনাম হিপ মেমরি বরাদ্দের বিষয়ে কথা বলবে কেন? এছাড়াও এই মধ্যে যায়।
স্ট্যাক এবং গাদা হ'ল
গাদা
তাহলে, কেন স্ট্যাক বা গাদাটি একেবারে আছে? যে জিনিসগুলি সুযোগ ছেড়ে দেয়, তাদের জন্য স্ট্যাকটি ব্যয়বহুল হতে পারে। কোডটি বিবেচনা করুন:
void foo(String arg) {
bar(arg);
...
}
void bar(String arg) {
qux(arg);
...
}
void qux(String arg) {
...
}
পরামিতিগুলিও স্ট্যাকের একটি অংশ। আপনার কাছে কোনও গাদা নেই এমন পরিস্থিতিতে আপনি স্ট্যাকের উপর পূর্ণ মানগুলি পাস করবেন। এটি "foo"
ছোট এবং ছোট স্ট্রিংগুলির জন্য ঠিক আছে ... তবে কেউ যদি স্ট্রিংটিতে একটি বিশাল এক্সএমএল ফাইল রাখে তবে কি হবে। প্রতিটি কল স্ট্যাকের উপরে পুরো বিশাল স্ট্রিংটি অনুলিপি করবে - এবং এটি যথেষ্ট অপব্যয় হবে।
পরিবর্তে, অবিলম্বে সুযোগের বাইরে কিছু জিনিস থাকা বস্তুগুলিকে (অন্য স্কোপে চলে গেছে, এমন কাঠামোর মধ্যে আটকে আছে যা অন্য কেউ রক্ষণাবেক্ষণ করছে, ইত্যাদি ...) অন্য একটি অঞ্চলে রেখে দেওয়া ভাল যা হিপ বলা হয়।
স্ট্যাকের উপর
আপনি না প্রয়োজন স্ট্যাক। হাইপোথটিকালি কেউ এমন একটি ভাষা লিখতে পারেন যা স্ট্যাক ব্যবহার করে না (স্বেচ্ছাসেবী গভীরতার)। একটি পুরানো বেসিক যা আমি আমার যৌবনে শিখেছি তা করেছে, একজন কেবল মাত্র 8 স্তরের gosub
কল করতে পারে এবং সমস্ত ভেরিয়েবলগুলি বিশ্বব্যাপী ছিল - কোনও স্ট্যাক ছিল না।
স্ট্যাকের সুবিধাটি হ'ল যখন আপনার সাথে একটি ভেরিয়েবল থাকে যা একটি সুযোগের সাথে উপস্থিত থাকে, যখন আপনি সেই সুযোগটি ছেড়ে যান, সেই স্ট্যাক ফ্রেমটি পপ হয়। এটি সত্যিই সরল করে দেয় সেখানে কী আছে এবং কী নেই। প্রোগ্রামটি অন্য পদ্ধতিতে চলে আসে, একটি নতুন স্ট্যাক ফ্রেম; প্রোগ্রামটি পদ্ধতিতে ফিরে আসে এবং আপনি আপনার বর্তমান সুযোগটি দেখেন এমন একটিতে ফিরে এসেছেন; প্রোগ্রামটি প্রক্রিয়াটি ছেড়ে দেয় এবং স্ট্যাকের সমস্ত আইটেমগুলি বাতিল করে দেওয়া হয়।
কোডটি স্ট্যাক এবং একটি হিপ ব্যবহারের জন্য রানটাইম লেখার জন্য ব্যক্তিটির পক্ষে এটি সত্যই জীবনকে সহজ করে তোলে। তারা ভাষায় কোড লেখার ব্যক্তিকে সেগুলি স্পষ্টভাবে চিন্তাভাবনা থেকে মুক্ত করার সুযোগ দিয়ে কোডটিতে কাজ করার অনেকগুলি ধারণা এবং উপায়গুলি।
স্ট্যাকের প্রকৃতির অর্থ হল এটি খণ্ডিত হয়ে উঠতে পারে না। মেমরি বিভাজন হ'ল একটি বাস্তব সমস্যা। আপনি কয়েকটি অবজেক্ট বরাদ্দ করেন, তারপরে আবর্জনা মধ্যম একটি সংগ্রহ করেন এবং তারপরে পরবর্তী বড়টির জন্য বরাদ্দ দেওয়ার জন্য জায়গা অনুসন্ধান করার চেষ্টা করুন। এটি একটি জগাখিচুড়ি. পরিবর্তে স্ট্যাকের উপর জিনিস রাখার অর্থ হ'ল এটি আপনাকে মোকাবেলা করতে হবে না।
যখন কিছু আবর্জনা সংগ্রহ করা হয়
যখন কোনও জিনিস আবর্জনা সংগ্রহ করা হয়, তখন তা চলে যায়। তবে এটি কেবল আবর্জনা সংগ্রহ করা হয়েছে কারণ এটি ইতিমধ্যে ভুলে গেছে - প্রোগ্রামটিতে বর্তমান অবজেক্ট থেকে অ্যাক্সেস পাওয়া যায় এমন কোনও বস্তুর উল্লেখ নেই।
আমি উল্লেখ করব যে এটি আবর্জনা সংগ্রহের খুব বড় সরলকরণ। অনেকগুলি আবর্জনা সংগ্রহকারী (এমনকি জাভার মধ্যেও - আপনি বিভিন্ন পতাকা ( ডকস ) ব্যবহার করে আবর্জনা সংগ্রহকারীকে কল করতে পারেন These এগুলি আলাদাভাবে আচরণ করে এবং প্রত্যেকে কীভাবে কাজ করে তার সংক্ষিপ্ততা এই উত্তরের জন্য কিছুটা গভীর। আপনি পড়তে ইচ্ছুক হতে পারেন জাভা আবর্জনা সংগ্রহের মূল বিষয়গুলি এর মধ্যে কীভাবে কাজ করে সে সম্পর্কে আরও ভাল ধারণা পেতে।
এটি বলেছিল, যদি স্ট্যাকের জন্য কিছু বরাদ্দ করা হয়, তবে এটি অংশ হিসাবে সংগ্রহ করা আবর্জনা নয় System.gc()
- স্ট্যাক ফ্রেমটি পপ হওয়ার পরে এটি নির্বিঘ্নিত হয়। যদি কিছু গাদা থাকে এবং স্ট্যাকের কোনও কিছু থেকে রেফারেন্স করা হয়, তবে এটি সেই সময়ে সংগ্রহ করা আবর্জনা হবে না।
কেন এই ব্যাপার?
বেশিরভাগ অংশে, এটির .তিহ্য। লিখিত পাঠ্য বই এবং সংকলক ক্লাস এবং বিভিন্ন বিট ডকুমেন্টেশন হিপ এবং স্ট্যাক সম্পর্কে একটি বড় চুক্তি করে।
যাইহোক, আজকের ভার্চুয়াল মেশিনগুলি (জেভিএম এবং অনুরূপ) প্রোগ্রামার থেকে এটিকে গোপন রাখার চেষ্টা করতে প্রচুর পরিমাণে গেছে। যদি না আপনি এক বা অন্যটির বাইরে চলে যান এবং কেন এটি জানেন (কেবলমাত্র স্টোরেজ স্পেসটি যথাযথভাবে বাড়ানো না থেকে), এটি খুব বেশি গুরুত্বপূর্ণ নয়।
অবজেক্টটি কোথাও এবং এটির জায়গায় যেখানে এটি উপস্থিত থাকা উপযুক্ত সময়ের জন্য সঠিকভাবে এবং দ্রুত অ্যাক্সেস করা যায়। যদি এটি স্ট্যাক বা গাদাতে থাকে - এটি আসলে কোনও ব্যাপার নয়।