Rumah > Java > javaTutorial > Bilakah Anda Harus Menangkap Java OutOfMemoryError?

Bilakah Anda Harus Menangkap Java OutOfMemoryError?

Barbara Streisand
Lepaskan: 2024-12-31 14:51:09
asal
257 orang telah melayarinya

When Should You Catch a Java OutOfMemoryError?

Menangkap java.lang.OutOfMemoryError?

Dokumentasi Java menasihatkan agar tidak menangkap java.lang.Error, termasuk java.lang.OutOfMemoryError. Walau bagaimanapun, terdapat situasi di mana tindakan sedemikian mungkin wajar.

Bila Catch OutOfMemoryError

Pertimbangkan untuk menangkap OutOfMemoryError hanya untuk penamatan yang anggun, melepaskan sumber dan log punca kegagalan. Ia berlaku apabila peruntukan memori blok gagal disebabkan oleh sumber timbunan yang tidak mencukupi. Namun, timbunan masih mengandungi objek yang diperuntukkan. Dengan menggugurkan rujukan kepada objek masa jalan, lebih banyak memori boleh dibebaskan untuk pembersihan.

Mengelakkan Peruntukan Memori dalam Pengendali Tangkapan

Untuk mengelakkan peruntukan memori selanjutnya dalam pengendali tangkapan, pertimbangkan :

  • Pengurusan Memori Manual: Gunakan Yang Tidak Selamat kelas untuk akses ingatan terus, mengelakkan overhed pengumpulan sampah Java.
  • Konteks Benang: Gunakan utas berasingan dengan ruang memori khusus untuk pengendalian pengecualian, mengelakkan kebocoran memori daripada utas utama.
  • Pengendalian Sumber Luaran: Mewakilkan keluaran sumber kepada entiti luar, seperti rangka kerja pengelogan, untuk mengelakkan peruntukan memori dalam JVM.

Kod Contoh

Kod berikut menunjukkan menangkap OutOfMemoryError dan membebaskan memori untuk pembersihan:

import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;

public class OutOfMemoryErrorHandling {

    private static final int MEGABYTE = (1024 * 1024);

    public static void main(String[] args) {
        MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();

        for (int i = 1; i <= 100; i++) {
            try {
                byte[] bytes = new byte[MEGABYTE * 500];
            } catch (OutOfMemoryError e) {
                // Cleanup operations:
                // Drop references to runtime objects
                // Release external resources (e.g., logging)

                MemoryUsage heapUsage = memoryBean.getHeapMemoryUsage();
                long maxMemory = heapUsage.getMax() / MEGABYTE;
                long usedMemory = heapUsage.getUsed() / MEGABYTE;
                System.out.println(i + " : Memory Use :" + usedMemory + "M/" + maxMemory + "M");
            }
        }
    }
}
Salin selepas log masuk

Kesimpulan

Menangkap OutOfMemoryError harus didekati dengan sangat berhati-hati dan hanya untuk memudahkan penamatan yang anggun. Dengan mengurus peruntukan memori dengan teliti dalam pengendali tangkapan, adalah mungkin untuk mengelakkan isu ingatan selanjutnya dan membenarkan pembersihan yang betul sebelum JVM keluar.

Atas ialah kandungan terperinci Bilakah Anda Harus Menangkap Java OutOfMemoryError?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan