Ini akan menjadi artikel yang lebih jahat. Di dunia Java, memori overflow hanyalah bug yang dapat Anda perkenalkan dalam kasus ini. Korban Anda akan menghabiskan beberapa hari atau bahkan beberapa minggu tidur malam di kantor.
Dalam artikel ini, saya akan memperkenalkan dua jenis metode overflow, yang lebih mudah dipahami dan direproduksi. Dan mereka semua adalah studi kasus dari proyek sumber, tetapi untuk membuat Anda memahami dengan jelas, saya menyederhanakannya.
Tetapi yakinlah bahwa setelah kita bertemu dan menyelesaikan bug yang meluap, kasus serupa akan lebih umum dari yang Anda bayangkan.
Mari kita masukkan negara bagian pertama.
KEYLessEntry {static class key {integer ID; Args) {peta m = new HashMap (); tentang (true) untuk (int i = 0; i <10000; i ++) if (! M.Containskey (i)) m.put (Kunci baru (i), "Nomor:" "" + i);}}Ketika Anda menjalankan kode di atas, Anda mungkin berharap itu tidak akan pernah memiliki masalah untuk dijalankan. Namun, ini bukan masalahnya. Elemen akan selalu tumbuh, karena kategori utama tidak menerapkan metode Equals () yang sesuai setelah hashCode ().
Solusinya sederhana, selama Anda menambahkan metode yang sama seperti contoh berikut. Tetapi sebelum menemukan masalah, Anda harus menghabiskan banyak sel otak yang berharga.
@Overridepublic boolean sama (objek o) {boolean response = false; if (tombol onstanceof) {response = (key) o) .ids (this.id);} response ret rn;} Yang berikutnya Anda harus mengingatkan teman Anda adalah menangani string. Kinerja akan aneh, terutama ketika perbedaan versi JVM digabungkan. Mekanisme kerja internal String telah diubah dalam JDK 7U6, jadi jika Anda menemukan bahwa lingkungan produk hanyalah perbedaan antara nomor versi kecil, maka Anda siap untuk kondisi. Tarze kode yang mirip dengan kode berikut, dan kemudian tanyakan mengapa bug ini hanya muncul dalam produk.
Kelas Stringer {Static Final MB = 1024*512; nanoTime ()); = CreateLongString (MB);Ada apa dengan kode di atas? Ketika berjalan sebelum versi JDK 7U6, string yang dikembalikan akan menyimpan referensi ke string ukuran sekitar 1m. Dikombinasikan dengan perbedaan antara platform dan versi di lingkungan eksperimental Anda, hal -hal yang melukai kitab suci otak terjadi.
Sekarang jika Anda ingin menutupi jejak kaki Anda, kami dapat memperkenalkan beberapa konsep yang lebih canggih. Misalnya
Saya harap kami memberi Anda beberapa bahan baku yang dipikirkan dan beberapa bahan saat Anda ingin memperbaiki seseorang. Ini akan membawa debugging tanpa akhir. Kecuali teman Anda menggunakan Plumbr untuk menemukan lokasi yang meluap.