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 :
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"); } } } }
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!