Flazzo memiliki fokus utama untuk menambah nilai bisnis Anda.

Blog

OutofmemoryErrors Memperbaiki dalam aplikasi Java

18321930-thumb.jpg
Blog

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.

Objek byte[]Thong, int[]


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 MemorySegmentyang mengurangi biaya pengumpulan sampah.

Saat Anda menggunakan try-with-resourcesArena 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 statis
createUnmarshaller() / / / 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 ServletContextITU @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]