ج #: لماذا أحصل على OutofMemoryException على nullreencexception؟
-
13-09-2019 - |
سؤال
حصلت على OutOfMemoryException
في وقت سابق ولا يمكن معرفة ما كان عليه. ولا معنى على الإطلاق. حفرت حولها في التعليمات البرمجية، وتذكرت فجأة أن في مكان ما قد نسي التحقق من فارغ، وفي هذه الحالة بالذات كان (ويجب أن يكون) بالضبط. هذا لا ينبغي أن يسبب OutOfMemoryException
في رأيي، ولكن أنا إصلاحه في أي حال بالطبع. وعندما فعلت، لم يعد الاستثناء بعد الآن!
لذلك أزلت الشيك مرة أخرى ودرس الاستثناء الذي حصلت عليه أكثر من ذلك. وتبين كان لديه innirexception من النوع NullReferenceException
وتتبع المكدس الذي صنع بالطبع كثير أكثر منطقية.
ولكن لماذا أحصل على OutOfMemoryException
ب هذا لم يحدث أبدا لي قبل ... لا معنى له ...
أحب أن أعطي بعض السياق، ولكن لا يمكنني أن أقول الكثير دون الحاجة إلى تحميل المشروع بأكمله، وهو ما لا أستطيع (والتي لا تريد أن تقرأها عبر أي حال: P). لكن المكان المحدد يحدث يبدو أن هذا:
{
foreach (var exportParameter in exportParameters)
{
// Copy to local
var ep = exportParameter;
// Load stored values from db
...
}
int i = 1;
exportParameters
.OrderBy(ø => ø.Sequence)
.ForEach(ø => { if (!ø.Locked) ø.Sequence = i++; });
}
كان الإصلاح لوضع if(exportParameters != null)
قبل كتلة التعليمات البرمجية. exportParameters
هو List<ExportParameter>
, ، إلا في حالة الفشل الذي كان فيه null
.
المحلول
قد تواجه المشكلة التي تم تصميم مناطق التنفيذ المقيدة للمنع - أي JITVING من بعض التعليمات البرمجية التي تعتمد جملة الصيد الخاصة بك تعتمد على حالة الذاكرة.
(ردا على تعليق Svish، هذا هو الرابط الأول عند googling العبارة: http://msdn.microsoft.com/en-us/library/ms2228973.aspx.)
نصائح أخرى
بصرف النظر عن السبب الواضح في الحصول على Oomexception، يمكنك أيضا الحصول عليه إذا كنت لا تزال تحتوي على ذاكرة متوفرة، وليس جزءا كبيرا كافيا لما يتم طلبه. إذا كنت تحصل عليه من بدء التشغيل بشكل موثوق ونسبيا نسبيا، فمن المحتمل أن تطلب عن طريق الخطأ المزيد من الذاكرة أكثر مما تنوي (أي طلب صفيف كبير جدا). يمكنك نشر القليل من التعليمات البرمجية أو على الأقل وصف نمط التخصيص الخاص بك؟