Java Memory: Heap Ruang dan Kolektor Sampah

Belajar tentang bagaimana Java mengelola memori melalui ruang tumpukan dan pengumpulan sampah. Memahami alokasi memori dapat membantu menghindari kebocoran memori dalam program Java.

A+ A-

Baru-baru ini, saya menulis sebuah aplikasi Java yang, ketika dijalankan, memerlukan sedikit memori dan saya mulai mendapatkan kesalahan OutOfMemory:

 Kesalahan: java.lang.OutOfMemoryError: tumpukan ruang Java 

Hal ini sering terjadi ketika kita perlu untuk menjalankan program memori-menenggak. Berikut adalah beberapa cara untuk memecahkan masalah tersebut.

Apa Jawa tumpukan ruang?

Pertama-tama, mari kita memahami apa yang ruang tumpukan. Nah, Java menggunakan memori terutama dalam pengaturan tumpukan dan tumpukan . Java terus parameter yang dilewatkan dari metode panggilan untuk sebuah metode yang disebut , dalam bentuk struktur stack (yaitu parameter didorong dan muncul dari tumpukan sesuai kebutuhan). Di sisi lain, tumpukan adalah ruang memori secara acak diakses di mana Java menciptakan dan menjaga benda-benda. Java menciptakan objek dalam ruang tumpukan ini di mana pun ia menemukan ruang yang cukup untuk mengandung objek. Jadi, ketika Anda membuat objek baru (misalnya baru String () ;) objek akan dibuat di ruang tumpukan dan menempati memori yang dapat masuk ke dalam. Selama pengumpulan sampah, Jawa membebaskan ruang tumpukan benda-benda yang tidak lagi dirujuk. Tetapi jika jumlah direferensikan (yaitu "diperlukan") objek terus meningkat dan kami tidak rasa hormat mereka -the JVM berjalan keluar dari ruang tumpukan.

Jumlah memori yang kelas akan memerlukan tergantung pada jumlah dan jenis anggota datanya.

  1. Kelas itu sendiri membutuhkan minimal 8 byte
  2. Setiap anggota data membutuhkan 4 byte (panjang dan ganda membutuhkan 8 byte). Bahkan sebuah variabel Boolean adalah menggunakan 4 byte meskipun hanya membutuhkan satu bit untuk disimpan.
  3. Jumlah memori yang digunakan tumbuh di potongan 8 byte
Optimalkan program Java Anda

Langkah pertama untuk mengatasi masalah ini harus pergi melalui program dan melihat bagaimana hal itu dapat dimodifikasi sehingga dapat membuatnya menggunakan memori yang lebih rendah. Sejak lama biaya memori telah sangat rendah dibandingkan dengan apa itu selama tahun 1960-an. Dan programmer telah menjadi cukup boros dalam hal tunjangan memori untuk program-program mereka. Namun masih, lebih sering daripada tidak, kita perlu menulis program yang membutuhkan memori lebih dari yang tersedia. Berhemat dalam konteks penggunaan memori selalu baik karena tidak hanya mengurangi kemungkinan kecelakaan Program tetapi juga kadang-kadang meningkatkan kecepatan eksekusi.

Anda harus menetapkan objek untuk null ketika mereka tidak lagi diperlukan dalam kode Anda. Hal ini bahkan lebih penting jika Anda menjalankan loop di mana Anda membuat objek (s) tapi kemudian tidak membuang mereka ketika mereka tidak diperlukan.

Menggunakan metode pengumpul sampah Java

Langkah kedua menuju memori optimasi penggunaan bisa secara eksplisit memanggil metode pengumpulan sampah. Java secara otomatis panggilan metode ini jika diperlukan dan membebaskan ruang memori yang berisi benda-benda yang tidak lagi dirujuk. Tapi Anda juga dapat memanggil metode ini secara eksplisit dalam kode Anda (misalnya, setelah "tugas besar" dicapai dan "tugas besar" selanjutnya akan segera dimulai). Untuk memanggil pengumpul sampah, menggunakan:

 Runtime.getRuntime () gc ().; 

Anda dapat memantau status memori sebelum dan sesudah () metode gc disebut.

 System.out.println ( "nnCalling Sampah Collectornn");
System.out.println ( "Memori bebas SEBELUM:" + Runtime.getRuntime () freeMemory ().);
Runtime.getRuntime () gc ().;
System.out.println ( "Memori bebas SETELAH:". + Runtime.getRuntime () freeMemory ());
System.out.println ( "nnGarbage koleksi finishednn"); 

Metode freememory () mengembalikan jumlah memori bebas yang tersedia diukur dalam byte. Untuk metode lain yang disediakan oleh kelas Runtime melihat Java API

Berikan lebih banyak memori untuk JVM

Upaya untuk penggunaan memori optimasi meskipun, kadang-kadang JVM memang membutuhkan lebih banyak memori. Dalam kasus seperti itu kita bisa mengatakan JVM melalui baris perintah untuk menggunakan jumlah tertentu dari memori:

 java -Xms2000m -Xmx3500m 

-Xms Dan -Xmx switch menentukan jumlah ruang swap (virtual memory) yang JVM dapat digunakan dalam mesin Anda.

-Xms Menentukan minimum (yaitu awal) jumlah memori

-Xmx Menentukan jumlah maksimum memori yang bisa menggunakan JVM.

Nilai-nilai memori ini harus ditentukan dalam Megabyte.

Jadi, ini adalah tentang Jawa mengelola memori melalui ruang tumpukan dan mekanisme pengumpulan sampah. Ini adalah pilihan cerdas dan setiap programmer Java harus memiliki pemahaman yang jelas tentang bagaimana Java menangani memori. Hanya Anda akan dapat efisien bekerja pada program intensif memori.