سؤال

حصلت على 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، يمكنك أيضا الحصول عليه إذا كنت لا تزال تحتوي على ذاكرة متوفرة، وليس جزءا كبيرا كافيا لما يتم طلبه. إذا كنت تحصل عليه من بدء التشغيل بشكل موثوق ونسبيا نسبيا، فمن المحتمل أن تطلب عن طريق الخطأ المزيد من الذاكرة أكثر مما تنوي (أي طلب صفيف كبير جدا). يمكنك نشر القليل من التعليمات البرمجية أو على الأقل وصف نمط التخصيص الخاص بك؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top