Tidak Dapat Memesan Ruang Yang Cukup Untuk Tumpukan Objek

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan mengetahui penyebab ralat "Tidak dapat menempah ruang yang cukup untuk tumpukan objek" , sambil menjalani beberapa kemungkinan senario.

2. Gejala

"Tidak dapat menempah ruang yang cukup untuk timbunan objek" adalah kesalahan JVM tertentu yang dibangkitkan ketika proses Java tidak dapat membuat mesin maya karena batasan memori yang dihadapi pada sistem yang sedang berjalan:

java -Xms4G -Xmx4G -jar HelloWorld.jar Error occurred during initialization of VM Could not reserve enough space for object heap Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit.

Secara amnya, ada dua senario yang mungkin berlaku ketika kita menghadapi kesalahan.

Pertama, apabila kita makan tengah hari proses Java dengan timbunan max had saiz parameter ( -Xmx ) dan nilai adalah lebih daripada apa proses boleh ada di sistem operasi .

Had ukuran timbunan berbeza berdasarkan beberapa kekangan:

  • seni bina perkakasan (32/64 bit)
  • Versi bit JVM (32/64 bit)
  • sistem operasi yang kita gunakan

Kedua, ketika proses Java tidak dapat menyimpan jumlah memori yang ditentukan kerana aplikasi lain yang berjalan pada sistem yang sama dan memakan memori.

3. Saiz timbunan

Java heap space adalah kumpulan alokasi memori untuk program Java runtime, yang dikelola oleh JVM itu sendiri. Secara lalai, kumpulan peruntukan dihadkan pada ukuran awal dan maksimum. Untuk mengetahui lebih lanjut mengenai Heap Space di Java, lihat artikel ini di sini.

Mari lihat berapa ukuran timbunan maksimum di persekitaran yang berbeza dan bagaimana kita dapat menetapkan hadnya.

3.1. Saiz Tumpukan Maksimum

Had timbunan teori maksimum untuk JVM 32-bit dan 64-bit mudah ditentukan dengan melihat ruang memori yang ada, 2 ^ 32 (4 GB) untuk JVM 32-bit dan 2 ^ 64 (16 Exabyte) untuk 64- bit JVM.

Dalam praktiknya, kerana pelbagai kekangan, hadnya jauh lebih rendah dan berbeza-beza berdasarkan sistem operasi. Sebagai contoh, pada sistem Windows 32-bit julat ukuran timbunan maksimum adalah antara 1.4 GB hingga 1.6 GB . Sebaliknya, pada sistem Linux 32-bit, ukuran timbunan maksimum boleh mencapai hingga 3 GB.

Atas sebab ini, jika aplikasi memerlukan timbunan yang besar, kita harus menggunakan JVM 64-bit . Namun, dengan timbunan yang besar, pengumpul sampah akan mempunyai lebih banyak pekerjaan yang perlu dilakukan, jadi penting untuk mencari keseimbangan antara ukuran timbunan dan prestasi.

3.2. Bagaimana Mengawal Had Ukuran Tumpukan?

Kami mempunyai dua pilihan untuk mengawal had ukuran timbunan JVM.

Pertama, dengan menggunakan parameter baris perintah Java pada setiap inisialisasi JVM:

-Xms Sets initial Java heap size. This value must be a multiple of 1024 and greater than 1 MB. -Xmx Sets maximum Java heap size. This value must be a multiple of 1024 and greater than 2 MB. -Xmn Sets the initial and maximum size (in bytes) of the heap for the young generation.

Untuk nilai ukuran, kita dapat menambahkan huruf k atau K , m atau M dan g atau G untuk menunjukkan kilobyte, megabyte, dan gigabyte masing-masing. Sekiranya tidak ada huruf yang ditentukan, unit lalai (bait) digunakan.

-Xmn2g -Xmn2048m -Xmn2097152k -Xmn2147483648

Kedua, dengan menggunakan variabel persekitaran JAVA_OPTS untuk mengkonfigurasi parameter baris perintah Java di atas secara global. Oleh kerana itu, setiap inisialisasi JVM pada sistem secara automatik akan menggunakan konfigurasi yang ditetapkan dalam pemboleh ubah persekitaran.

JAVA_OPTS="-Xms256m -Xmx512m"

Untuk maklumat lebih lanjut, lihat panduan Parameter JVM komprehensif kami.

4. Kesimpulan

Dalam tutorial ini, kami membincangkan dua kemungkinan senario apabila JVM tidak dapat menempah ruang yang cukup untuk timbunan objek . Kami juga belajar bagaimana mengawal had ukuran timbunan untuk mengurangkan ralat ini.

Seterusnya, ketahui lebih lanjut mengenai masalah ingatan yang berpotensi pada waktu berjalan dan bagaimana mengenal pasti masalah tersebut.