Atasi “OutOfMemoryError: Java heap space” dan “Could not reserve enough space” pada pelayan Minecraft
Tiga masalah berbeza dipanggil “out of memory”. Jika pelayan tidak mahu bermula dan menyebut object heap, anda meminta Java menggunakan RAM lebih banyak daripada yang dimiliki mesin. Jika ia berjalan kemudian ranap dengan OutOfMemoryError, ia memerlukan lebih daripada yang anda beri, atau sesuatu bocor. Jika ia hanya menyatakan “Killed”, sistem pengendalian yang menamatkannya.
Ralat mana yang anda alami?
| Mesej | Maksudnya |
|---|---|
| Could not reserve enough space for object heap | Semasa bermula: -Xmx melebihi memori yang ada, atau anda menggunakan Java 32-bit. |
| java.lang.OutOfMemoryError: Java heap space | Semasa berjalan: heap penuh. Pelayan memerlukan lebih memori, beban lebih ringan, atau ada kebocoran. |
| GC overhead limit exceeded | Java menghabiskan hampir seluruh masanya membersihkan memori. Puncanya sama seperti heap yang penuh. |
| “Killed”, atau exit code 137 | Sistem pengendalian atau container menamatkan pelayan kerana seluruh mesin kehabisan memori. |
Could not reserve enough space for object heap
- Semak memori yang bebas. Pada Linux, jalankan
free -h. Pada Windows, buka Task Manager. - Turunkan -Xmx. Java menggunakan lebih daripada heap, jadi pada mesin kecil hadkan -Xmx kepada paling banyak kira-kira tiga perempat RAM. Pada pelayan 4 GB, 3G ialah had atas yang selamat.
- Gunakan Java 64-bit. Output
java -versionsepatutnya menyebut 64-Bit. Java 32-bit tidak dapat menempah heap yang besar.
java -Xms3G -Xmx3G -jar server.jar --nogui
Tetapkan -Xms sama dengan -Xmx, supaya pelayan menempah memorinya sekali sahaja di awal.
java.lang.OutOfMemoryError: Java heap space
- Beri pelayan lebih banyak memori, jika mesin ada. Lihat berapa banyak RAM yang diperlukan pelayan Minecraft untuk saiz mengikut jenis pelayan.
- Kurangkan beban. Turunkan
view-distancedansimulation-distancedalam server.properties, contohnya kepada 8 dan 6. - Cari kebocoran. Pasang plugin atau mod spark, biarkan pelayan berjalan sehingga memori tinggi, kemudian jalankan
/spark heapsummary. Ia menyenaraikan apa yang menggunakan memori paling banyak. Kelas daripada satu plugin di bahagian atas senarai menunjuk kepada puncanya. - Kemas kini atau buang puncanya. Kebocoran memori sering dibetulkan dalam versi plugin yang lebih baharu. Memberi plugin yang bocor lebih banyak memori hanya melambatkan ranap.
- Mulakan semula mengikut jadual. Permulaan semula harian menyembunyikan kebocoran perlahan sehingga anda menemuinya. Ia penyelesaian sementara, bukan pembetulan.
“Killed” dan exit code 137
Ini bukan ralat Java. Pada Linux, out-of-memory killer menamatkan proses terbesar apabila seluruh mesin kehabisan memori, dan container berbuat demikian pada had memorinya. Sahkan dalam log kernel:
sudo dmesg | grep -i "killed process"
Untuk membetulkannya, turunkan -Xmx supaya Java bersama semua yang lain pada mesin muat dalam RAM, dan hentikan perisian lain yang rakus memori, seperti pangkalan data atau pelayan permainan kedua. Fail swap kecil berfungsi sebagai jaring keselamatan, bukan pengganti RAM.
Elakkan ia berulang
- Pilih saiz heap berdasarkan jenis pelayan dan bilangan pemain, kemudian pantau penggunaan sebenar dengan spark.
- Jana dunia terlebih dahulu, supaya penjanaan chunk tidak melonjakkan memori semasa pemain meneroka.
- Pastikan plugin dan perisian pelayan sentiasa dikemas kini.
Hos pelayan Minecraft anda di Singapura
Ping rendah untuk pemain di India, Malaysia dan Indonesia, pada teras AMD EPYC yang pantas dengan NVMe dan perlindungan DDoS.
