นี่จะเป็นบทความที่ชั่วร้ายมากขึ้นเมื่อคุณต้องการสร้างโศกนาฏกรรมในชีวิตของใครบางคนคุณอาจไปที่ Google เพื่อค้นหา ในโลกของ Java ความทรงจำล้นเป็นเพียงข้อผิดพลาดที่คุณอาจแนะนำในกรณีนี้ ผู้ที่ตกเป็นเหยื่อของคุณจะใช้เวลาสองสามวันหรือแม้แต่สองสามสัปดาห์ในการนอนหลับในสำนักงาน
ในบทความนี้ฉันจะแนะนำวิธีการล้นสองประเภทซึ่งง่ายต่อการเข้าใจและทำซ้ำ และพวกเขาทั้งหมดเป็นกรณีศึกษาของโครงการแหล่งที่มา แต่เพื่อให้คุณเข้าใจได้อย่างชัดเจนฉันทำให้พวกเขาง่ายขึ้น
แต่มั่นใจได้ว่าหลังจากที่เราพบและแก้ไขข้อผิดพลาดที่ล้นออกมากรณีที่คล้ายกันจะเป็นเรื่องธรรมดามากกว่าที่คุณจินตนาการ
ก่อนอื่นเข้าสู่สถานะ
คลาส KeylessEntry {คีย์คลาสคงที่ {INTEGER ID; args) {map m = new hashmap (); เกี่ยวกับ (จริง) สำหรับ (int i = 0; i <10,000; "หมายเลข:" "" + i);}}เมื่อคุณเรียกใช้รหัสด้านบนคุณอาจคาดหวังว่าจะไม่มีปัญหาในการทำงาน อย่างไรก็ตามนี่ไม่ใช่กรณี องค์ประกอบจะเติบโตเสมอเนื่องจากหมวดหมู่คีย์ไม่ได้ใช้วิธี Equals () ที่เหมาะสมหลังจาก HashCode ()
การแก้ปัญหานั้นง่ายตราบใดที่คุณเพิ่มวิธีเท่ากับตัวอย่างเช่นตัวอย่างต่อไปนี้ แต่ก่อนที่จะพบปัญหาคุณต้องใช้เซลล์สมองที่มีค่ามากมาย
@OverridePublic Boolean เท่ากับ (Object O) {การตอบสนองของบูลีน = false; ถ้า (onstanceof key) {response = ((คีย์) o) .ids (this.id);} retu rn response;} สิ่งต่อไปที่คุณต้องเตือนเพื่อน ๆ ของคุณคือการจัดการกับสตริง ประสิทธิภาพของมันจะแปลก ๆ โดยเฉพาะอย่างยิ่งเมื่อรวมความแตกต่างของรุ่น JVM เข้าด้วยกัน กลไกการทำงานภายในของ String มีการเปลี่ยนแปลงใน JDK 7U6 ดังนั้นหากคุณพบว่าสภาพแวดล้อมของผลิตภัณฑ์เป็นเพียงความแตกต่างระหว่างหมายเลขรุ่นเล็ก ๆ คุณก็พร้อมสำหรับเงื่อนไข Tarze รหัสคล้ายกับรหัสต่อไปนี้แล้วถามเขาว่าทำไมข้อบกพร่องนี้ปรากฏในผลิตภัณฑ์เท่านั้น
คลาส Stringer {คงที่ int mb = 1024*512; nanotime ()); return sb.toString ();} โมฆะคงที่สาธารณะหลัก (สตริง [] args) {รายการย่อย = new ArrayList (); = CreateLongString (MB);รหัสข้างต้นมีอะไรผิดปกติ? เมื่อมันทำงานก่อนเวอร์ชันของ JDK 7U6 สตริงที่ส่งคืนจะบันทึกการอ้างอิงไปยังสตริงที่มีขนาดประมาณ 1m เมื่อรวมกับความแตกต่างระหว่างแพลตฟอร์มและเวอร์ชันในสภาพแวดล้อมการทดลองของคุณสิ่งที่ทำร้ายพระคัมภีร์สมองเกิดขึ้น
ตอนนี้ถ้าคุณต้องการปกปิดรอยเท้าของคุณเราสามารถแนะนำแนวคิดขั้นสูงเพิ่มเติมได้ ตัวอย่างเช่น
ฉันหวังว่าเราจะให้วัตถุดิบแก่คุณและวัสดุบางอย่างเมื่อคุณต้องการซ่อมแซมใครสักคน สิ่งนี้จะนำมาซึ่งการดีบักที่ไม่มีที่สิ้นสุด เว้นแต่เพื่อนของคุณจะใช้ Plumbr เพื่อค้นหาตำแหน่งที่ล้น