Memori Ruang Tumpukan Java dengan Runtime API

1. Gambaran keseluruhan

Dalam artikel ini, kita akan membincangkan API yang disediakan oleh Java yang dapat membantu kita memahami beberapa aspek yang berkaitan dengan ruang timbunan Java.

Ini dapat berguna dalam memahami status memori JVM terkini dan mengalihkannya ke perkhidmatan pemantauan seperti StatsD dan Datadog yang kemudiannya dapat dikonfigurasi untuk mengambil tindakan pra-pilihan dan mengelakkan kegagalan aplikasi.

2. Mengakses Parameter Memori

Setiap aplikasi Java mempunyai satu contoh java.lang.Runtime yang dapat membantu kita memahami status memori aplikasi semasa. The Runtime # getRuntime kaedah statik boleh dipanggil untuk mendapatkan lajang yang Runtime misalnya.

2.1. Jumlah Memori

Kaedah Runtime # getTotalMemory mengembalikan jumlah ruang timbunan yang kini ditempah oleh JVM dalam bait. Ini termasuk memori yang disediakan untuk objek semasa dan masa depan. Oleh itu, tidak dijamin akan tetap semasa pelaksanaan program kerana ruang timbunan Java dapat diperluas atau dikurangkan karena lebih banyak objek dialokasikan.

Juga, nilai ini tidak semestinya digunakan atau memori maksimum yang ada.

2.2. Memori Percuma

Kaedah Runtime # freeMemory mengembalikan ruang timbunan percuma yang tersedia untuk peruntukan objek baru dalam bait. Ia mungkin meningkat sebagai hasil operasi pengumpulan sampah di mana lebih banyak memori percuma tersedia selepas itu.

2.3. Memori Maksimum

Kaedah Runtime # maxMemory mengembalikan memori maksimum yang akan digunakan oleh JVM. Setelah penggunaan memori JVM mencapai nilai ini, maka ia tidak akan memperuntukkan lebih banyak memori dan sebaliknya, dan ia akan mengumpulkan sampah lebih kerap.

Sekiranya objek JVM masih memerlukan lebih banyak memori walaupun selepas pengumpul sampah dijalankan, maka JVM boleh membuang pengecualian java.lang.OutOfMemoryErro r.

3. Contoh

Dalam contoh di bawah, kami menginisialisasi ArrayList dan menambahkan elemen padanya sambil menjejaki ruang timbunan JVM menggunakan tiga kaedah 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 apabila cukup objek diperuntukkan ruang di timbunan Java.
  • Baris 900080: Pada ketika ini, JVM mempunyai lebih banyak ruang yang tersedia kerana GC telah berjalan sehingga nilai Runtime # freeMemory dan Runtime # totalMemory meningkat.

Nilai-nilai yang ditunjukkan di atas diharapkan akan berbeza pada setiap aplikasi Java.

4. Menyesuaikan Parameter Memori

Kita dapat mengesampingkan nilai lalai untuk parameter memori JVM dengan menetapkan nilai khusus ke bendera tertentu ketika menjalankan program Java kami untuk mencapai prestasi memori yang diperlukan:

  • -Xms: Nilai yang diberikan pada bendera -Xms menetapkan nilai awal dan minimum timbunan Java. Aplikasi ini dapat digunakan dalam keadaan di mana aplikasi kita memerlukan lebih banyak memori daripada minimum lalai ketika memulakan JVM
  • -Xmx: Begitu juga, kita dapat menetapkan nilai maksimum untuk ruang timbunan dengan menetapkannya pada bendera -Xmx . Ini dapat digunakan ketika kita ingin membatasi jumlah memori yang akan digunakan aplikasi kita, dengan sengaja.

Perlu diketahui juga bahawa nilai -Xms harus sama atau lebih kecil daripada nilai -Xmx .

4.1. Penggunaan

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

Dalam artikel ini, kami telah melihat cara mendapatkan metrik memori JVM melalui kelas Runtime . Kaedah ini boleh berguna semasa menyiasat kebocoran memori JVM dan masalah berkaitan prestasi memori JVM yang lain.

Kami juga telah menunjukkan cara menetapkan nilai khusus untuk bendera tertentu yang membawa kepada tingkah laku memori JVM yang berbeza untuk senario yang berbeza.