জাভাতে অবজেক্ট / অ্যারে বরাদ্দকালে ওভারহেড কেন?


9

জাভাতে কোন অ্যারে কতগুলি বাইট দখল করে? ধরুন এটি একটি 64 বিট মেশিন এবং ধরে নিও যে কোনও অ্যারেতে N উপাদান রয়েছে, সুতরাং এই সমস্ত উপাদান বিভিন্ন ধরণের অ্যারের জন্য 2 * N, 4 * N বা 8 * N বাইট গ্রহণ করবে।

এবং কুরসেরা-র একটি বক্তৃতাতে বলা হয়েছে যে এটি এন এলিমেন্ট অ্যারের জন্য 2 * এন + 24, 4 * এন + 24 বা 8 * এন + 24 বাইট দখল করবে এবং 24 বাইটকে ওভারহেড বলা হয়, তবে ওভারহেড কেন হয় তা ব্যাখ্যা করেনি প্রয়োজন ছিল।

এছাড়াও অবজেক্টগুলির ওভারহেড থাকে যা 16 বাইট।

এই ওভারহেডগুলি ঠিক কী? এই 24/16 বাইট গঠিত কি?

এছাড়াও, এই ওভারহেডগুলি কি কেবল জাভাতেই বিদ্যমান? সি, সি ++ এবং পাইথন সম্পর্কে কীভাবে?



1
@ জিঞ্জুহুজ: আপনার জিজ্ঞাসার অর্থ কি: এই ওভারহেডটি কোন ডেটা দ্বারা গঠিত?
হতাশ

@ ইয়ানিসরিজোস: আমার মনে হয় ওপি অ্যারেগুলির জন্য 24 24 বাইটে আসলে কী তা জানতে চায়।
হতাশ

@ ফ্রাস্ট্রেটেড উইথফর্মস ডিজাইনার আহ, এটি আমার চেয়ে প্রশ্নটির আরও ভাল ব্যাখ্যা বলে মনে হচ্ছে।
ইন্নিস

@ ইউনিসরিজস আমার খারাপ মনোভাবের জন্য দুঃখিত। তবে আপনি যখন এই লিঙ্কটি পোস্ট করেন আমি সাহায্য করতে পারি না তবে মনে করি এটি একরকম বিদ্রূপ। খুব বেশি ডিফেন্সিভ, আমার ধারণা।
Gnijuohz

উত্তর:


16

প্রতিটি জাভা অবজেক্টের একটি শিরোনাম থাকে যাতে জেভিএমের জন্য গুরুত্বপূর্ণ তথ্য থাকে। সর্বাধিক গুরুত্বপূর্ণটি হ'ল অবজেক্টের ক্লাসের (একটি মেশিন শব্দ) একটি রেফারেন্স, এবং এখানে কিছু পতাকা রয়েছে যা আবর্জনা সংগ্রহকারী এবং সিঙ্ক্রোনাইজেশন পরিচালনা করতে (যেহেতু প্রতিটি বস্তুর সাথে সিঙ্ক্রোনাইজ করা যায়) যা অন্য একটি মেশিন শব্দ গ্রহণ করে (আংশিক শব্দ ব্যবহার করে পারফরম্যান্সের জন্য খারাপ হতে হবে)। সুতরাং এটি 2 শব্দ, যা 32 বিট সিস্টেমে 8 বাইট, এবং 64 বিটের 16 বাইট। অ্যারে দৈর্ঘ্যের জন্য অতিরিক্ত অ্যারেগুলির জন্য একটি ক্ষেত্রের ক্ষেত্র প্রয়োজন, যা আরও 4 বাইট, 64৪ বিট সিস্টেমে সম্ভবত 8

অন্যান্য ভাষা হিসাবে:

  • সি এর অবজেক্ট নেই, অবশ্যই এতে অবজেক্ট শিরোনাম নেই - তবে প্রতিটি মেমরির আলাদাভাবে বরাদ্দকৃত অংশে একটি শিরোনাম থাকতে পারে।

  • সি ++ এ, আপনার আবর্জনা সংগ্রহ নেই এবং সিঙ্ক্রোনাইজেশনের জন্য স্বেচ্ছাসেবী বস্তু ব্যবহার করতে পারবেন না, তবে আপনার যদি ওভাররাইড পদ্ধতিগুলির সাথে ক্লাস করেন তবে প্রতিটি বস্তুর জাভা অবজেক্টের শ্রেণির সাথে তার রেফারেন্সের মতোই তার ভিটেবলের পয়েন্টার রয়েছে। যদি আপনি স্মার্ট পয়েন্টারগুলি ব্যবহার করেন যা আবর্জনা সংগ্রহ করেন, তাদের গৃহকর্মী ডেটা প্রয়োজন।

  • পাইথন সম্পর্কে আমি জানি না, তবে আমি খুব নিশ্চিত যে এটিরও ক্লাসের একটি রেফারেন্স এবং আবর্জনা সংগ্রাহকের জন্য গৃহকর্তার তথ্য প্রয়োজন।


অবজেক্ট শিরোনামের আকার হ্রাস করতে এই মুহুর্তে ওপেনজেডকেতে কাজ চলছে, ছোট তবে গুরুত্বপূর্ণ পদক্ষেপগুলি :-)
মার্তিজান ভারবার্গ

সি ++ এ কেবল বহুবর্ষীয় ক্লাসে ভিটিবেল প্রয়োজন। std::pair<int, float>একটি সাধারণ বর্গ যা একটি vtable প্রয়োজন হয় না। ফলস্বরূপ, এটি 8 বাইটে খুব ভাল ফিট করতে পারে। এছাড়াও, স্মার্ট পয়েন্টারগুলিতে গৃহস্থালি যুক্ত করার প্রয়োজন নেই। একটি সুস্পষ্ট পাল্টা উদাহরণ std::unique_ptr<T>, যা সাধারণত কাঁচা T*(অনন্য_পাত্র অবশ্যই জিসি করেন না) এর মতোই বড় ।
এমসাল্টাররা

4
সি এর mallocওভারহেডও রয়েছে, মেমরির প্রতিটি- অনুমোদিত ব্লকের একটি হেডার প্রয়োজন হয় যা freeপরে ব্যবহার করে।
হার্বি

কমপক্ষে একটি ম্যালোক লাইব্রেরি যা আমি জানি সেগুলি 32-বিট সিস্টেমে 8-বাইট শিরোনাম ব্যবহার করে (যা 4-বাইট দৈর্ঘ্যের যা 2 বাইট সেন্ডিনেল মান দুটি আইআরসি দ্বারা বন্ধনীযুক্ত) IR
ডোনাল ফেলো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.