.NET ফ্রেমওয়ার্ক কীভাবে আউটআফমেমারিএক্সসেপ্টের জন্য মেমরি বরাদ্দ করে?


144

সি ++ তে স্তূপে মেমরি বরাদ্দ না করে মান দ্বারা একটি ব্যতিক্রম ছুঁড়ে ফেলা সম্ভব, সুতরাং এই পরিস্থিতিটি বোঝা যায়। কিন্তু। নেট ফ্রেমওয়ার্কটি OutOfMemoryExceptionএকটি রেফারেন্স টাইপ, সুতরাং এটি একটি গাদা উপর বরাদ্দ করা হয়। OutOfMemoryExceptionযখন কোনও নতুন অবজেক্ট তৈরি করার মতো পর্যাপ্ত মেমরি নেই তখন কিভাবে নেট ফ্রেমওয়ার্ক মেমরি বরাদ্দ করে ?


6
দুর্দান্ত প্রশ্ন। সম্ভবত পর্যাপ্ত স্মৃতি কেবল সেই পরিস্থিতির জন্য সংরক্ষিত।
গ্রেটএন্ডপাওয়ারফুলফজ

19
ইতিমধ্যে এখানে অন্য উত্তর যুক্ত করতে, মনে রাখবেন যে ওওএম এর অর্থ হল যে আপনি যে ব্লকটি অনুরোধ করেছেন তা বরাদ্দ করা যাবে না। আপনি যদি 100Mb এর জন্য জিজ্ঞাসা করেন এবং রানটাইমটি সর্বাধিক উপলব্ধ ব্লকটি কেবল 99Mb পাওয়া যায় তবে এটি ব্যর্থ হবে। তবে একটি OOM ব্যতিক্রমের জন্য কেবল কয়েক বাইট মেমরির প্রয়োজন। কেবলমাত্র আপনার বরাদ্দ ব্যর্থ হওয়ায় এর অর্থ এই নয় যে শূন্য মেমরি বাকি আছে। তবে অবশ্যই সম্ভবত এই পরিস্থিতিতে নিজেকে coverাকতে রানটাইম কিছুটা স্মৃতি সংরক্ষণ করে
জেসন উইলিয়ামস

4
সি ++ সম্পর্কে আপনার ধারণাটি ভুলভাবে by সংকলকটির উপর নির্ভর করে ব্যতিক্রমগুলি ভালভাবে বরাদ্দ হতে পারে। এমএস সংকলকটি করে না, তবে সাধারণ সি ++ এবিআইতে ব্যতিক্রমগুলি হিপগুলিতে বরাদ্দ করা হয়, বাদে সেখানে একটি ছোট্ট পূর্বনির্ধারিত জরুরি বাফার রয়েছে যা গাদাতে স্থান না রেখে পরিবর্তে ব্যবহৃত হবে।
সেবাস্তিয়ান রেডল

উত্তর:


163

এটি রানটাইম দ্বারা পূর্বনির্ধারিত। আপনি যদি কোনও পরিচালিত প্রক্রিয়াটির হিপ আবিষ্কার করেন তবে আপনি সেই ব্যতিক্রমের উদাহরণ খুঁজে পাবেন।

এখানে হ্যালো ওয়ার্ল্ড অ্যাপ্লিকেশনটির পূর্বনির্ধারিত ব্যতিক্রমগুলি রয়েছে:

0:003> !dumpheap -stat -type Exception
Statistics:
      MT    Count    TotalSize Class Name
735f2920        1           84 System.ExecutionEngineException
735f28dc        1           84 System.StackOverflowException
735f2898        1           84 System.OutOfMemoryException
735f2744        1           84 System.Exception
735f2964        2          168 System.Threading.ThreadAbortException


36
রানটাইমটি আপনার কোডের মতো একই নিয়মে খেলতে হবে না। আরেকটি উদাহরণ হ'ল আপনি যদি ফেলে দেন তবে আপনি StackOverflowExceptionএটি ধরতে পারেন, তবে রানটাইম যদি সেই ব্যতিক্রম ছুঁড়ে ফেলে তবে আপনি এটি ধরতে পারবেন না (ডিফল্টরূপে)।
ব্রায়ান রাসমুসেন

8
সিএলআর এর অন্তর্নিহিত প্রক্রিয়াগুলির বেশিরভাগটি আসলে "সি" এবং "সি ++" তে লেখা থাকে। সুতরাং, এটি পুরোপুরি সম্ভব যে অবজেক্টটি "নতুন জায়গায় এসেছে" বা স্মৃতিটি অন্যথায় ম্যানিপুলেটেড।
গ্রেটএন্ডপাওয়ারফুলফজ

2
@hvd এর পার্শ্ব প্রতিক্রিয়া কী? ওম কি স্ট্যাক ট্রেস দেয়? যদিও আমার কাছে বাকি তথ্যগুলি মোটামুটি স্থিতিশীল?
জেমস ব্যারাস

7
একই ধরণের দু'টি ব্যতিক্রম ব্যতীত যদি দুটি থ্রেড একই সাথে ফেলে দেয় তবে কী হবে?
ট্রুবেনফুচস

42

রানটাইমের অভ্যন্তরে যখন কোনও স্মৃতি ছাড়িয়ে যায় তখন এটি থ্রোআউটআউটফেমোরি কল করে । এটি এক্সপেশন :: গেটোমেক্সেপশন বলে , যা স্ট্যাকের উপর অবজেক্টটি তৈরি করে এবং তার পরে এটি স্ট্যাটিক্যালি-বরাদ্দ গ্লোবাল দৃষ্টান্তে অনুলিপি করে, যা পরে নিক্ষেপ করা হয়।

এটি পরিচালিত ব্যাতিক্রম নয়, যদিও এটি ex + এ ঘোষণা করা একটি সি ++ ব্যতিক্রম । সি ++ ব্যতিক্রমসমূহ পরিচালিত ব্যতিক্রমসমূহ রূপান্তরিত হয় clrex.cpp , যা কোডে বিশেষভাবে preallocated নিক্ষেপ রয়েছে পরিচালিত OutOfMemoryException, যা মূলত বরাদ্দ করা হয় এবং নির্মাণ appdomain.cpp

দ্রষ্টব্য: এই উত্স ফাইলগুলির মধ্যে কিছু বড় এবং এটি আপনার সিনেমার সিনট্যাক্স হাইলাইট করার সময় কয়েক সেকেন্ডের জন্য আপনার ব্রাউজারকে ঝুলিয়ে রাখতে পারে।

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.