سيكون هذا مقالًا أكثر شريرًا. في عالم Java ، يعد تفوق الذاكرة مجرد خطأ قد تقدمه في هذه الحالة. سيقضي ضحاياك بضعة أيام أو حتى بضعة أسابيع من ليالي النوم في المكتب.
في هذه المقالة ، سأقدم نوعين من طرق الفائض ، والتي من الأسهل فهمها وإعادة إنتاجها. وهم جميعا دراسات حالة لمشروع المصدر ، ولكن من أجل أن تجعلك تدرك بوضوح ، أقوم بتبسيطها.
لكن كن مطمئنًا أنه بعد مواجهتنا وحلنا الخلل المفرط ، ستكون الحالات المماثلة أكثر شيوعًا مما تتخيل.
دعنا ندخل الحالة أولاً عند استخدام Hashset/HashMap ، فإن القيمة الرئيسية المستخدمة هي أو طريقة HashCode () غير صحيحة ، مما سيؤدي إلى خطأ سيئ السمعة.
مفتاح الفئة {static class {integer id ؛ args) {map m = new hashmap () ؛ "الرقم:" "" + i) ؛}}عندما تقوم بتشغيل الكود أعلاه ، قد تتوقع أن يكون هناك مشكلة في تشغيلها. ومع ذلك ، هذا ليس هو الحال. ستنمو العناصر دائمًا ، لأن الفئة الرئيسية لا تنفذ طريقة تساوي () مناسبة بعد HashCode ().
الحل بسيط ، طالما قمت بإضافة طريقة متساوية مثل المثال التالي. ولكن قبل العثور على المشكلة ، يجب أن تكون قد قضيت الكثير من خلايا الدماغ القيمة.
Overridepublic Boolean يساوي (كائن O) {Boolean Response = false ؛ التالي الذي عليك أن تذكري أصدقائك هو التعامل مع السلسلة. سيكون أدائها غريبًا ، خاصةً عندما يتم الجمع بين اختلاف إصدار JVM. تم تغيير آلية العمل الداخلية للسلسلة في JDK 7U6 ، لذلك إذا وجدت أن بيئة المنتج ليست سوى الفرق بين رقم إصدار صغير ، فأنت جاهز للظروف. tarze الرمز مماثل للرمز التالي ، ثم اسأله عن سبب ظهور هذا الخطأ فقط في المنتج.
stringer {static final int mb = 1024*512 ؛ nanotime ()) ؛ = Createlongstring (MB) ؛ما الخطأ في الكود أعلاه؟ عندما يتم تشغيله قبل إصدار JDK 7U6 ، ستحفظ السلسلة التي تم إرجاعها إشارة إلى سلسلة بحوالي 1 متر. جنبا إلى جنب مع الاختلافات بين المنصات والإصدارات في بيئتك التجريبية ، تحدث الأشياء التي تؤذي الكتاب المقدس الدماغ.
الآن إذا كنت ترغب في التستر على آثار أقدامك ، فيمكننا تقديم بعض المفاهيم الأكثر تقدمًا. على سبيل المثال
آمل أن نقدم لك بعض المواد الخام التي تفكر في بعض المواد عندما تريد إصلاح شخص ما. هذا سوف يجلب تصحيح أخطاء لا نهاية لها. ما لم يكن صديقك يستخدم Plumbr للعثور على موقع الفائض.