OutofmemoryErrors Memperbaiki dalam aplikasi Java

OutofmemoryErrors Memperbaiki dalam aplikasi Java
[ad_1]
Dalam salah satu artikel saya sebelumnya, kami membahas cara terbaik untuk menemukan kebocoran dan alasan di baliknya. Lebih disukai menggunakan alat yang ditargetkan dan modern seperti Heathero untuk mendeteksi kesalahan outofmemory dan banyak hambatan kinerja lainnya, karena dapat mengidentifikasi penyebab nyata dan menyarankan cara untuk mengoptimalkan penggunaan sumber daya TI.
Di atas, Anda dapat melihat bahwa ada beberapa ribu objek byte[]
,, String
,, int[]
,, dll.
Mari kita bahas dengan cara tertentu untuk memperbaiki OutOfMemoryErrors
Di Java. Anda dapat melihat perbaikan mana yang berlaku dalam skenario / kode Anda dan menerapkannya untuk menyimpan memori dan lebih baik menjalankan program Anda. Beberapa cara yang dibahas di bawah ini mungkin tampak sepele bagi Anda, tetapi jangan lupa bahwa beberapa koreksi kecil dapat ditambahkan ke keuntungan besar.
1. Gunakan bytebuffer dari java.nio
Alih -alih mengalokasikan tabel besar byte yang dapat diremehkan, Itu memungkinkan tunjangan memori langsung (Bytebuffer.allocateirect (ukuran)) untuk mengurangi tekanan GC dan menghindari Tunjangan tumpukan yang tidak perlu.
Jika Anda berurusan dengan jaringan pertumbuhan dinamis, hindari memulai dengan jaringan yang tidak perlu yang tidak perlu.
ByteBuffer buffer = ByteBuffer.allocateDirect(1024); // Allocates 1KB in off-heap memory
Misalnya, alih -alih:
ByteArrayOutputStream baos = new ByteArrayOutputStream(10000);// Too large
Biarkan Java mengelola mengubah ukuran jika perlu karena JVM dan JRES terus ditingkatkan untuk mengkonsumsi sumber daya minimum dan mengelola siklus sumber daya mereka.
ByteArrayOutputStream baos = new ByteArrayOutputStream(); // Starts small and grows as needed
Atau berikan ukuran awal yang kecil jika Anda tahu panjang minimum yang dibutuhkan sebelumnya.
ByteArrayOutputStream baos = new ByteArrayOutputStream(2048); // Starts small and grows as needed
2. Gunakan aliran untuk memproses data dalam potongan
Alih -alih membaca seluruh file dalam memori menggunakan tabel besar byte,
Misalnya, jangan gunakan:
byte[] data = Files.readAllBytes(Path.of("myLargeFile.txt")); // Loads entire file into memory
Sebaliknya, coba ini:
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("myLargeFile.txt"));
ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
byte[] buffer = new byte[2048]; // Read in smaller chunks
int bytesRead;
while ((bytesRead = bis.read(buffer)) != -1) {
baos.write(buffer, 0, bytesRead);
}
byte[] data = baos.toByteArray();
}
3. Penggunaan antarmuka segmen memori baru di Java 21
Anda dapat mengakses memori keluar dari kepala atau di kepala dengan API fungsi dan memori asing (FFM). Itu memperkenalkan konsep Arena. Anda menggunakan arena untuk mengalokasikan segmen memori dan mengontrol siklus hidup segmen memori asli.
SegmentAllocator
Sejak Proyek Panama (Java 21) Memungkinkan kontrol yang lebih baik atas tunjangan memori.
Alih -alih lukisan besar berdasarkan tumpukan, alokasikan memori menggunakan MemorySegment
yang mengurangi biaya pengumpulan sampah.
Saat Anda menggunakan try-with-resources
Arena akan ditutup segera setelah blok uji berakhir, semua segmen memori yang terkait dengan ruang lingkupnya tidak valid dan daerah memori yang mendukungnya diperlakukan.
Misalnya:
import java.lang.foreign.*;
String s = "My LARGE ......... LARGE string";
try (Arena arena = Arena.ofConfined()) {
// Allocate off-heap memory
MemorySegment nativeText = arena.allocateUtf8String(s);
// Access off-heap memory
for (int i = 0; i < s.length(); i++ ) {
System.out.print((char)nativeText.get(ValueLayout.JAVA_BYTE, i));
}
} // Off-heap memory is deallocated
4. Gunakan objek singleton sebanyak mungkin
Kelas -kelas layanan publik tertentu tidak perlu dipakai berdasarkan permintaan; Mungkin ada contoh statis tunggal untuk seluruh aplikasi / sesi.
Misalnya, Kecemasan. Non-sponsor adalah bagian dari spesifikasi JAXB. Mereka digunakan untuk mengubah data XML menjadi objek Java menjadi representasi XML -nya. Demikian juga, marshal digunakan untuk mengubah objek Java menjadi representasi XML. Ini membantu memproses data XML dalam program Java dengan memetakan elemen XML dan atribut ke bidang dan properti Java, menggunakan anotasi Java.
Jika Anda melihat dengan cermat di Jaxbcontext kelas, Anda akan melihat bahwa ia memiliki metode statiscreateUnmarshaller()
/ / / createMarshaller()
Metode, yang dengan jelas menunjukkan bahwa mereka dapat dikelola dengan lebih baik dalam satu badan statis untuk seluruh aplikasi / sesi.
5. Gunakan skala singleton di aplikasi berbasis musim semi Anda
Dengan cara ini, wadah membuat satu badan kacang ini untuk seluruh aplikasi, sejauh mungkin, menjaga logika komersial Anda tetap utuh.
Jika pengkodean aplikasi web, jangan lupa bahwa @application
Ruang lingkup menciptakan instance kacang untuk siklus hidup a ServletContext
ITU @request
Lingkup menciptakan instance kacang untuk permintaan HTTP tunggal, sedangkan ruang lingkup sesi menciptakan badan kacang untuk sesi HTTP tertentu.
@Bean
@Scope("singleton")
public SomeService someService() {
return new SomeService();
}
6. Gunakan alternatif yang lebih cepat dan efisien untuk koleksi populer
Untuk menggunakan Collection.singletonmap Dan Collection.singletonlist (untuk koleksi kecil)
Misalnya, jika Anda hanya membutuhkan sepasang nilai atau elemen kunci tunggal, hindari menggunakan hashmap atau arrayist lengkap, yang memiliki biaya umum.
Untuk menggunakan Snowsho Alih-alih Listin tertaut
Listin tertaut Memiliki biaya tinggi memori tinggi karena penyimpanan pointer simpul (referensi mengikuti / direncanakan). Sebaliknya, gunakan SnowshoYang lebih cepat dan ekonomis dalam memori.
import java.util.ArrayDeque;
ArrayDeque deque = new ArrayDeque();
deque.add(22);
deque.removeFirst();
Untuk menggunakan Peta.of () Dan List.of () (Koleksi Immutable)
Jika Anda tidak perlu memodifikasi koleksi, gunakan koleksi abadi, yang kompak dan dioptimalkan.
Map map = Map.of("A", 1, "B", 2);
List list = List.of("X", "Y", "Z");
Untuk menggunakan Lemahhashmap untuk mengobrol
Jika Anda menyimpan data sementara dalam hashmap, itu mungkin tidak akan pernah dikumpulkan dari sampah, maka gunakan Lemahhashmapyang secara otomatis menghapus input ketika tombol tidak lagi dirujuk.
7. Tutup benda segera setelah utilitas mereka berakhir
Soket jaringan, aliran I / O, koneksi basis data dan objek database / jaringan terus menggunakan sumber daya memori dan CPU, menambah aplikasi aplikasi.
Kami membahas cara -cara mengalami waktu untuk mengelola kesalahan pembukaan di Java.
Komentar Anda dipersilakan.
[ad_2]