Saya selalu dapat mengalokasikan 1400 megabyte untuk Java SE yang berjalan pada Windows XP 32-bit (Java 1.4, 1.5 dan 1.6).
java -Xmx1400m ...
Hari ini saya mencoba opsi yang sama pada mesin Windows XP baru menggunakan Java 1.5_16 dan 1.6.0_07 dan mendapatkan kesalahan:
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
Melalui trial and error, tampaknya 1200 megabyte adalah jumlah terbesar yang dapat saya alokasikan untuk mesin ini.
Adakah ide mengapa satu mesin mengizinkan 1400 dan yang lainnya hanya 1200?
Sunting: Mesin memiliki RAM 4GB dengan sekitar 3,5GB yang dapat dikenali Windows.
Jawaban:
Perlu diingat bahwa Windows memiliki manajemen memori virtual dan JVM hanya membutuhkan memori yang berdekatan dalam ruang alamatnya . Jadi, program lain yang berjalan pada sistem seharusnya tidak memengaruhi ukuran heap Anda. Apa yang akan menghalangi Anda adalah DLL yang dimuat ke ruang alamat Anda. Sayangnya, pengoptimalan di Windows yang meminimalkan relokasi DLL selama penautan membuat kemungkinan Anda akan memiliki ruang alamat yang terfragmentasi. Hal-hal yang cenderung memotong ruang alamat Anda selain dari hal-hal biasa termasuk perangkat lunak keamanan, perangkat lunak CBT, spyware, dan bentuk malware lainnya. Kemungkinan penyebab perbedaan adalah patch keamanan yang berbeda, versi runtime C, dll. Driver perangkat dan bit kernel lainnya memiliki ruang alamat sendiri (2 GB lainnya dari ruang 32-bit 4 GB).
Anda dapat mencoba melalui binding DLL Anda dalam proses JVM Anda dan mencoba untuk me-rebase DLL Anda ke dalam ruang alamat yang lebih ringkas. Tidak menyenangkan, tetapi jika Anda putus asa ...
Atau, Anda bisa beralih ke Windows 64-bit dan JVM 64-bit. Terlepas dari apa yang disarankan orang lain, meskipun itu akan mengunyah lebih banyak RAM, Anda akan memiliki ruang alamat virtual yang jauh lebih berdekatan, dan mengalokasikan 2GB secara berdekatan akan sepele.
sumber
Ini ada hubungannya dengan memori yang berdekatan.
Berikut beberapa info yang saya temukan online untuk seseorang yang menanyakan hal itu sebelumnya, diduga dari "Dewa VM":
sumber
Batas ukuran heap Java untuk Windows adalah:
Ini tidak membantu Anda mendapatkan heap Java yang lebih besar, tetapi sekarang Anda tahu bahwa Anda tidak dapat melampaui nilai-nilai ini.
sumber
Oracle JRockit , yang dapat menangani heap yang tidak bersebelahan, dapat memiliki ukuran heap Java 2,85 GB pada Windows 2003 / XP dengan sakelar / 3GB. Tampaknya fragmentasi dapat berdampak cukup besar pada seberapa besar tumpukan Java.
sumber
JVM membutuhkan memori yang berdekatan dan tergantung pada apa lagi yang sedang berjalan, apa yang berjalan sebelumnya, dan bagaimana jendela mengelola memori, Anda mungkin dapat memperoleh hingga 1,4GB memori yang berdekatan. Saya pikir 64bit Windows akan memungkinkan tumpukan yang lebih besar.
sumber
JVM Sun membutuhkan memori yang berdekatan. Jadi jumlah maksimal memori yang tersedia ditentukan oleh fragmentasi memori. Terutama dll driver cenderung memecah memori, saat memuat ke beberapa alamat dasar yang telah ditentukan. Jadi perangkat keras Anda dan drivernya menentukan berapa banyak memori yang bisa Anda dapatkan.
Dua sumber untuk ini dengan pernyataan dari insinyur Sun: blog forum
Mungkin JVM lain? Sudahkah Anda mencoba Harmony ? Saya pikir mereka berencana untuk mengizinkan memori non-kontinu.
sumber
Saya pikir ini lebih berkaitan dengan bagaimana Windows dikonfigurasi seperti yang diisyaratkan oleh tanggapan ini: Opsi Java -Xmx
Beberapa pengujian lagi: Saya dapat mengalokasikan 1300MB pada mesin Windows XP lama dengan hanya 768MB RAM fisik (ditambah memori virtual). Di mesin RAM 2GB saya, saya hanya bisa mendapatkan 1220MB. Di berbagai mesin perusahaan lainnya (dengan Windows XP yang lebih lama) saya bisa mendapatkan 1400MB. Mesin dengan batas 1220MB cukup baru (baru saja dibeli dari Dell), jadi mungkin memiliki Windows dan DLL yang lebih baru (dan lebih membengkak) (menjalankan Window XP Pro Version 2002 SP2).
sumber
Saya mendapat pesan kesalahan ini saat menjalankan program java dari VPS virtuozzo (memori terbatas). Saya belum menentukan argumen memori apa pun, dan ternyata saya harus menetapkan jumlah yang kecil secara eksplisit karena defaultnya pasti terlalu tinggi. Misalnya -Xmx32m (jelas perlu disetel tergantung pada program yang Anda jalankan).
Letakkan ini di sini jika ada orang lain yang mendapatkan pesan kesalahan di atas tanpa menentukan sejumlah besar memori seperti yang dilakukan penanya.
sumber
JDK / JRE sun membutuhkan jumlah memori yang berdekatan jika Anda mengalokasikan blok yang sangat besar.
OS dan aplikasi awal cenderung mengalokasikan potongan-potongan selama memuat fragmen RAM yang tersedia. Jika blok yang berdekatan TIDAK tersedia, SUN JDK tidak dapat menggunakannya. JRockit dari Bea (diakuisisi oleh Oracle) dapat mengalokasikan memori dari beberapa bagian.
sumber
Semua orang tampaknya menjawab tentang memori yang berdekatan, tetapi telah mengabaikan untuk mengakui masalah yang lebih mendesak.
Bahkan dengan 100% alokasi memori yang berdekatan, Anda tidak dapat memiliki ukuran heap 2 GiB pada OS Windows 32-bit (* secara default). Ini karena proses Windows 32-bit tidak dapat menangani lebih dari 2 GiB ruang.
Proses Java akan berisi perm gen (sebelum Java 8), ukuran stack per thread, overhead JVM / library (yang meningkat cukup banyak dengan setiap build) semua selain heap .
Lebih lanjut, flag JVM dan nilai defaultnya berubah antar versi. Jalankan saja yang berikut dan Anda akan mendapatkan beberapa ide:
Banyak opsi yang memengaruhi pembagian memori masuk dan keluar dari heap. Memberi Anda lebih atau kurang dari 2 GiB untuk dimainkan ...
Untuk menggunakan kembali bagian-bagian dari ini jawaban saya (sekitar Tomcat, tetapi berlaku untuk setiap proses Java):
sumber
Berikut adalah cara meningkatkan ukuran Paging
sumber
** Ada banyak cara untuk mengubah ukuran heap seperti,
Apa yang berhasil bagi saya adalah
Setel jalur JAVA_HOME yang tepat jika java Anda diperbarui.
buat variabel sistem baru komputer-> properti-> pengaturan lanjutan- > buat variabel sistem baru
name: _JAVA_OPTION value: -Xmx750m
FYI: Anda dapat menemukan VMoption default di bantuan Intellij- > edit opsi VM kustom , Di file ini Anda melihat ukuran minimum dan maksimum heap. **
sumber
Pertama, menggunakan file halaman saat Anda memiliki RAM 4 GB tidak berguna. Windows tidak dapat mengakses lebih dari 4GB (sebenarnya, kurang karena lubang memori) sehingga file halaman tidak digunakan.
Kedua, ruang alamat dibagi menjadi 2, setengah untuk kernel, setengah untuk mode pengguna. Jika Anda membutuhkan lebih banyak RAM untuk aplikasi Anda, gunakan opsi / 3GB di boot.ini (pastikan java.exe ditandai sebagai "alamat besar sadar" (google untuk info lebih lanjut).
Ketiga, saya pikir Anda tidak dapat mengalokasikan ruang alamat 2 GB penuh karena java membuang beberapa memori secara internal (untuk utas, kompiler JIT, inisialisasi VM, dll). Gunakan sakelar / 3GB untuk lebih.
sumber