Java Heap Space Memory dengan Runtime API

1. Ikhtisar

Di artikel ini, kita akan membahas API yang disediakan oleh Java yang dapat membantu kita memahami beberapa aspek yang terkait dengan ruang heap Java.

Hal ini dapat berguna dalam memahami status memori JVM saat ini dan mengalihkannya ke layanan pemantauan seperti StatsD dan Datadog yang kemudian dapat dikonfigurasi untuk mengambil tindakan pencegahan dan menghindari kegagalan aplikasi.

2. Mengakses Parameter Memori

Setiap aplikasi Java memiliki satu instance java.lang.Runtime yang dapat membantu kita memahami status memori aplikasi saat ini. The Runtime # getRuntime metode statis dapat dipanggil untuk mendapatkan tunggal Runtime misalnya.

2.1. Memori Total

Metode Runtime # getTotalMemory mengembalikan total ruang heap yang saat ini dicadangkan oleh JVM dalam byte. Ini termasuk memori yang dicadangkan untuk objek saat ini dan masa depan. Oleh karena itu, tidak dijamin akan konstan selama eksekusi program karena ruang heap Java dapat diperluas atau dikurangi karena lebih banyak objek dialokasikan.

Selain itu, nilai ini belum tentu apa yang sedang digunakan atau memori maksimum yang tersedia.

2.2. Memori Bebas

Metode Runtime # freeMemory mengembalikan ruang heap kosong yang tersedia untuk alokasi objek baru dalam byte. Ini dapat meningkat sebagai akibat dari operasi pengumpulan sampah di mana lebih banyak memori bebas tersedia setelahnya.

2.3. Memori Maksimum

Metode Runtime # maxMemory mengembalikan memori maksimum yang akan coba digunakan JVM. Setelah penggunaan memori JVM mencapai nilai ini, JVM tidak akan mengalokasikan lebih banyak memori dan sebaliknya, ini akan mengumpulkan sampah lebih sering.

Jika objek JVM masih membutuhkan lebih banyak memori bahkan setelah pengumpul sampah dijalankan maka JVM mungkin menampilkan pengecualian runtime java.lang.OutOfMemoryErro r.

3. Contoh

Dalam contoh di bawah ini, kami menginisialisasi ArrayList dan menambahkan elemen ke dalamnya sambil melacak ruang heap JVM menggunakan tiga metode di atas:

ArrayList arrayList = new ArrayList(); System.out.println("i \t Free Memory \t Total Memory \t Max Memory"); for (int i = 0; i < 1000000; i++) { arrayList.add(i); System.out.println(i + " \t " + Runtime.getRuntime().freeMemory() + " \t \t " + Runtime.getRuntime().totalMemory() + " \t \t " + Runtime.getRuntime().maxMemory()); } // ...
Output: i Free Memory Total Memory Max Memory 0 254741016 257425408 3817865216 1 254741016 257425408 3817865216 ... 1498 254741016 257425408 3817865216 1499 253398840 257425408 3817865216 1500 253398840 257425408 3817865216 ... 900079 179608120 260046848 3817865216 900080 302140152 324534272 3817865216 900081 302140152 324534272 3817865216 ...
  • Baris 1498: Nilai Runtime # freeMemory berkurang saat objek yang cukup dialokasikan ruang di heap Java.
  • Baris 900080: Pada titik ini, JVM memiliki lebih banyak ruang yang tersedia karena GC telah berjalan sehingga nilai Runtime # freeMemory dan Runtime # totalMemory meningkat.

Nilai yang ditampilkan di atas diharapkan berbeda pada setiap aplikasi Java yang dijalankan.

4. Menyesuaikan Parameter Memori

Kita dapat mengganti nilai default untuk parameter memori JVM dengan menyetel nilai kustom ke flag tertentu saat menjalankan program Java untuk mencapai performa memori yang diperlukan:

  • -Xms: Nilai yang ditetapkan ke -Xms flag menyetel nilai awal dan minimum heap Java. Ini dapat digunakan dalam kasus di mana aplikasi kita membutuhkan lebih banyak memori daripada minimum default saat memulai JVM
  • -Xmx: Demikian pula, kita dapat menyetel nilai maksimum untuk ruang heap dengan menetapkannya ke flag -Xmx . Ini dapat digunakan ketika kita ingin membatasi jumlah memori yang akan digunakan aplikasi kita, dengan sengaja.

Harap perhatikan juga bahwa nilai -Xms harus sama atau lebih kecil dari nilai -Xmx .

4.1. Pemakaian

java -Xms32M -Xmx64M Main Free Memory : 31792664 bytes Total Memory : 32505856 bytes Max Memory : 59768832 bytes java -Xms64M -Xmx64M Main Free Memory : 63480640 bytes Total Memory : 64487424 bytes Max Memory : 64487424 bytes java -Xms64M -Xmx32M Main Error occurred during initialization of VM Initial heap size set to a larger value than the maximum heap size

5. Kesimpulan

Pada artikel ini, kami telah melihat cara mengambil metrik memori JVM melalui kelas Runtime . Metode ini dapat berguna saat menyelidiki kebocoran memori JVM dan masalah terkait kinerja memori JVM lainnya.

Kami juga telah menunjukkan cara menetapkan nilai khusus untuk tanda tertentu yang mengarah ke perilaku memori JVM yang berbeda untuk skenario yang berbeda.