ইডেন স্পেস
সুতরাং আমার প্রশ্নটি হ'ল এগুলির কোনও সত্যই সত্য হতে পারে এবং যদি তাই হয় তবে কেন জাভাটির গাদা বরাদ্দ এত দ্রুত।
জাভা জিসি কীভাবে কাজ করে তা সম্পর্কে আমি কিছুটা অধ্যয়ন করছি যেহেতু এটি আমার কাছে খুব আকর্ষণীয়। আমি সর্বদা আমার সি এবং সি ++ (সিতে অনুরূপ কিছু বাস্তবায়নের চেষ্টা করতে আগ্রহী) এর মেমরি বরাদ্দ কৌশলগুলির সংগ্রহটি প্রসারিত করার চেষ্টা করছি এবং এটি থেকে একটি ফেটে ফ্যাশনে প্রচুর পরিমাণে বরাদ্দ করা খুব দ্রুত উপায় a ব্যবহারিক দৃষ্টিভঙ্গি তবে মূলত মাল্টিথ্রেডিংয়ের কারণে।
জাভা জিসি বরাদ্দ যেভাবে কাজ করে তা হ'ল প্রাথমিকভাবে "ইডেন" স্পেসে অবজেক্টগুলিকে বরাদ্দ দেওয়ার জন্য অত্যন্ত সস্তা বরাদ্দ কৌশলটি ব্যবহার করা। আমি যা বলতে পারি তা থেকে এটি ক্রমানুসারে পুল বরাদ্দকারী ব্যবহার করে।
এটি পুরোপুরি দ্রুতগতির ক্ষেত্রে malloc
সি বা ডিফল্টের সাধারণ উদ্দেশ্যগুলির চেয়ে operator new
সি ++ এ ছুঁয়ে ফেলার জন্য বাধ্যতামূলক পৃষ্ঠা ত্রুটিগুলি হ্রাস করার ক্ষেত্রে এবং গতিরোধের দিক থেকে অনেক দ্রুত
তবে ক্রম বরাদ্দকারীদের একটি সুস্পষ্ট দুর্বলতা রয়েছে: তারা পরিবর্তনশীল-আকারের অংশগুলি বরাদ্দ করতে পারে তবে তারা কোনও পৃথক অংশকে মুক্ত করতে পারে না। এগুলি কেবল প্রান্তিককরণের জন্য প্যাডিংয়ের সাথে একটি সরল ক্রমবর্ধমান ফ্যাশনে বরাদ্দ দেয় এবং তারা একবারে বরাদ্দ সমস্ত মেমরি কেবল খাঁটি করতে পারে। এগুলি সাধারণত সি এবং সি ++ তে ডেটা স্ট্রাকচার তৈরির জন্য দরকারী যা কেবলমাত্র সন্নিবেশের প্রয়োজন হয় এবং উপাদানগুলির অপসারণের প্রয়োজন হয় না, যেমন কোনও অনুসন্ধান শুরু হওয়া বৃক্ষের মতো কেবল যখন কোনও প্রোগ্রাম শুরু হয় এবং একবার বারবার অনুসন্ধান করা হয় বা কেবল নতুন কী যুক্ত করা হয় (তখনই এটি তৈরি করা প্রয়োজন) কোনও কী সরানো হয়নি)।
এগুলি এমনকি ডেটা স্ট্রাকচারের জন্যও ব্যবহার করা যেতে পারে যা উপাদানগুলিকে সরিয়ে ফেলার অনুমতি দেয়, তবে সেই উপাদানগুলি মেমরি থেকে আসলে মুক্তি পাবে না কারণ আমরা এগুলি পৃথকভাবে অপসারণ করতে পারি না। অনুক্রমিক বরাদ্দকারী ব্যবহার করে এমন কাঠামো কেবল আরও বেশি বেশি মেমরি গ্রাস করতে পারে, যদি না এটির কিছু বিলম্বিত পাস থাকে যেখানে ডেটা একটি নতুন অনুক্রমিক বরাদ্দকারীকে ব্যবহার করে একটি তাজা, কমপ্যাক্ট অনুলিপিটিতে অনুলিপি করা হয় (এবং এটি কোনও নির্দিষ্ট বরাদ্দকারী জিতলে কখনও কখনও এটি খুব কার্যকর কৌশল হয়) কোনও কারণে করবেন না - কেবল ক্রমানুসারে ডাটা স্ট্রাকচারের একটি নতুন অনুলিপি বরাদ্দ করুন এবং পুরাতনটির সমস্ত স্মৃতি ডাম্প করুন)।
সংগ্রহ
উপরের ডেটা স্ট্রাকচার / সিক্যুয়াল পুলের উদাহরণ হিসাবে, জাভা জিসি যদি এইভাবে বরাদ্দ দেয় তবে এটি একটি বিশাল সমস্যা হবে যদিও এটি অনেকগুলি পৃথক অংশের বরাদ্দ বরাদ্দের জন্য খুব দ্রুত। সফ্টওয়্যারটি বন্ধ না হওয়া অবধি এটি কোনও কিছুই মুক্ত করতে সক্ষম হবে না, যার পর্যায়ে এটি একবারে সমস্ত মেমরি পুলকে (শুদ্ধ) মুক্ত করতে পারে।
সুতরাং, পরিবর্তে, একটি একক জিসি চক্রের পরে, "ইডেন" স্পেসে বিদ্যমান অবজেক্টগুলির মাধ্যমে একটি পাস তৈরি করা হয় (ধারাবাহিকভাবে বরাদ্দ), এবং যেগুলি এখনও রেফারেন্স করা হয় তারপরে পৃথক খণ্ডগুলি মুক্ত করতে সক্ষম আরও সাধারণ-উদ্দেশ্যে বরাদ্দকারী ব্যবহার করে বরাদ্দ পান। যেগুলি আর রেফারেন্স করা হয় নি সেগুলি শুদ্ধ করার প্রক্রিয়াতে কেবল অবিচ্ছিন্ন হয়ে যাবে। সুতরাং মূলত এটি "এডেন স্পেসের বাইরে অবজেক্টগুলি অনুলিপি করা হয় যদি তারা এখনও রেফারেন্স করা থাকে, এবং তারপরে শুদ্ধ হয়"।
এটি সাধারণত বেশ ব্যয়বহুল হবে, সুতরাং মূলত সমস্ত মেমরির বরাদ্দ করা থ্রেড উল্লেখযোগ্যভাবে আটকে না দেওয়ার জন্য এটি একটি পৃথক পটভূমির থ্রেডে সম্পন্ন করা হয়েছে।
একবার ইডেন স্পেসের বাইরে মেমোরি অনুলিপি করা হয় এবং এই আরও ব্যয়বহুল স্কিম ব্যবহার করে বরাদ্দ দেওয়া হয় যা প্রাথমিক জিসি চক্রের পরে পৃথক অংশগুলি মুক্ত করতে পারে, বস্তুগুলি আরও ধ্রুবক স্মৃতি অঞ্চলে চলে যায়। Individual স্বতন্ত্র অংশগুলি পরে জিসি চক্রগুলিতে রেফারেন্স হওয়া বন্ধ করে দিলে তারা মুক্ত হয়।
গতি
সুতরাং, অদ্ভুতভাবে বলতে গেলে, জাভা জিসি খুব সহজেই সি বা সি ++ ছাড়িয়ে যাওয়ার সরাসরি কারণ হতে পারে কারণ এটি মেমরি বরাদ্দের অনুরোধ করে থ্রেডের মধ্যে সস্তার, সম্পূর্ণ অবক্ষয়যুক্ত বরাদ্দ কৌশলটি ব্যবহার করছে। তারপরে এটি আরও বেশি ব্যয়বহুল কাজ সাশ্রয় করে যা সাধারণত যখন আমাদের malloc
অন্য থ্রেডের জন্য স্ট্রেট-আপ এর মতো সাধারণ জলাধার ব্যবহার করে তখন সাধারণত আমাদের প্রয়োজন হয় to
সুতরাং ধারণাগতভাবে জিসিকে আসলে সামগ্রিক আরও বেশি কাজ করতে হবে, তবে এটি থ্রেডগুলিতে বিতরণ করছে যাতে সম্পূর্ণ ব্যয়টি একক থ্রেডের মাধ্যমে পরিশোধ না করে। এটি থ্রেড বরাদ্দকরণের মেমরিটিকে এটি অতি সস্তার করার অনুমতি দেয় এবং তারপরে জিনিসগুলি যথাযথভাবে করার জন্য প্রয়োজনীয় সত্য ব্যয় পিছনে দেয় যাতে পৃথক বস্তুগুলি অন্য থ্রেডে প্রকৃতপক্ষে মুক্ত হতে পারে। সি বা সি ++ এ যখন আমরা malloc
বা কল করি তখন আমাদের operator new
একই থ্রেডের মধ্যে পুরো দামের পুরো মূল্য দিতে হয়।
এটিই মূল পার্থক্য এবং জাভা কেন খুব সহজেই সি বা সি ++ ছাড়িয়ে কেবলমাত্র নিখুঁত কলগুলি ব্যবহার করে malloc
বা operator new
স্বতন্ত্রভাবে কিশোর খণ্ডগুলির জন্য একগুচ্ছ বরাদ্দ করতে পারে। অবশ্যই কিছুটা পারমাণবিক অপারেশন এবং কিছু সম্ভাব্য লকিং যখন জিসি চক্রটি চালু হয়, তবে এটি সম্ভবত বেশ কিছুটা অনুকূলিত হয়েছে।
মূলত সরল ব্যাখ্যাটি একক থ্রেড ( malloc
) বনাম ভারসামুল্যে একটি ভারী মূল্য প্রদান করে এবং সমান্তরালে ( GC
) সমান্তরালে চলতে পারে এমন আরেকটি ভারী মূল্য প্রদানের ক্ষেত্রে উত্সাহিত করে । ক্ষয়ক্ষতির কাজগুলি এইভাবে বোঝায় যে অবজেক্টের রেফারেন্স থেকে অবজেক্টের রেফারেন্স থেকে অবজেক্টের রেফারেন্স থেকে অডিও বিদ্যমান রেফারেন্সকে অকার্যকর না করে মেমরিটিকে চারপাশে স্থানান্তরিত করার অনুমতি দেওয়ার জন্য আপনার দুটি নির্দেশনা প্রয়োজন, এবং একবার অবজেক্ট মেমরির পরে আপনি স্থানিক লোকসান হারাতে পারেন you "ইডেন" স্থান থেকে সরে গেছে।
সর্বশেষে তবে সর্বনিম্ন নয়, তুলনাটি কিছুটা অন্যায় কারণ সি ++ কোড সাধারণত গাদাতে পৃথকভাবে অবজেক্টগুলির একটি নৌকা বোঝা বরাদ্দ করে না। শালীন সি ++ কোড মঞ্জুরিযুক্ত ব্লক বা স্ট্যাকের অনেক উপাদানগুলির জন্য মেমরি বরাদ্দ করে to যদি এটি ফ্রি স্টোরটিতে একসাথে ক্ষুদ্র বস্তুগুলির একটি বোতল লোড বরাদ্দ করে, কোডটি শিট করা হয়।