JVM 32-bit yang diharapkan memiliki satu potongan besar memori dan menggunakan pointer mentah tidak dapat menggunakan lebih dari 4 Gb (karena itu adalah batas 32 bit yang juga berlaku untuk pointer). Ini termasuk Sun dan - saya cukup yakin - juga implementasi IBM. Saya tidak tahu apakah misalnya JRockit atau lainnya memiliki opsi memori yang besar dengan implementasi 32-bit mereka.
Jika Anda berharap untuk mencapai batas ini, Anda harus benar-benar mempertimbangkan untuk memulai track paralel yang memvalidasi JVM 64-bit untuk lingkungan produksi Anda sehingga Anda siap untuk itu ketika lingkungan 32-bit rusak. Jika tidak, Anda harus melakukan pekerjaan itu di bawah tekanan, yang tidak pernah menyenangkan.
Sunting 2014-05-15: FAQ Oracle:
Batas maksimum tumpukan teoretis untuk JVM 32-bit adalah 4G. Karena berbagai kendala tambahan seperti swap yang tersedia, penggunaan ruang alamat kernel, fragmentasi memori, dan overhead VM, dalam praktiknya, batasnya bisa jauh lebih rendah. Pada kebanyakan sistem Windows 32-bit modern, ukuran heap maksimum akan berkisar dari 1.4G hingga 1.6G. Pada kernel Solaris 32-bit, ruang alamat dibatasi hingga 2G. Pada sistem operasi 64-bit yang menjalankan VM 32-bit, ukuran heap maksimal bisa lebih tinggi, mendekati 4G di banyak sistem Solaris.
( http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#gc_heap_32bit )
Thorbjørn Ravn Andersen
sumber
Anda dapat menanyakan Java Runtime:
Ini akan melaporkan "Memori Maks" berdasarkan alokasi heap default. Jadi, Anda masih perlu bermain dengan
-Xmx
(di HotSpot ). Saya menemukan bahwa berjalan di Windows 7 Enterprise 64-bit, HotSpot JVM 32-bit saya dapat mengalokasikan hingga 1577MiB:Sedangkan dengan JVM 64-bit di OS yang sama, tentunya jauh lebih tinggi (sekitar 3TiB)
Seperti yang telah disebutkan orang lain, itu tergantung pada OS.
Untuk OS host 64-bit, jika JVM adalah 32-bit, itu masih akan bergantung, kemungkinan besar seperti di atas seperti yang ditunjukkan.
- PEMBARUAN 20110905 : Saya hanya ingin menunjukkan beberapa pengamatan / detail lainnya:
Runtime.MaxMemory
yang dapat dialokasikan juga tergantung pada set kerja sistem operasi . Saya pernah menjalankan ini ketika saya juga menjalankan VirtualBox dan menemukan saya tidak berhasil memulai JVM HotSpot dengan-Xmx1590M
dan harus menjadi lebih kecil. Ini juga menyiratkan bahwa Anda mungkin mendapatkan lebih dari 1590M tergantung pada ukuran set kerja Anda pada saat itu (meskipun saya masih mempertahankannya di bawah 2GiB untuk 32-bit karena desain Windows)sumber
Anda tidak menentukan OS mana .
Di bawah Windows (untuk aplikasi saya - aplikasi manajemen risiko yang berjalan lama) kami mengamati bahwa kami tidak dapat melangkah lebih jauh dari 1280MB pada Windows 32bit. Saya ragu bahwa menjalankan JVM 32bit di bawah 64bit akan membuat perbedaan.
Kami mem-porting aplikasi ke Linux dan menjalankan JVM 32-bit pada perangkat keras 64-bit dan memiliki VM 2.2GB yang berjalan dengan cukup mudah.
Masalah terbesar yang mungkin Anda miliki adalah GC bergantung pada tujuan penggunaan memori Anda.
sumber
Dari 4.1.2 Ukuran Heap :
Menemukan jawaban yang cukup bagus di sini: Memori maksimum Java pada Windows XP .
sumber
Kami baru saja mengalami beberapa pengalaman dengan ini. Kami baru-baru ini telah melakukan porting dari Solaris (x86-64 Versi 5.10) ke Linux (RedHat x86-64) dan menyadari bahwa kami memiliki lebih sedikit memori yang tersedia untuk proses JVM 32 bit di Linux daripada Solaris.
Untuk Solaris ini hampir mencapai 4GB (http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#gc_heap_32bit).
Kami menjalankan aplikasi kami dengan -Xms2560m -Xmx2560m -XX: MaxPermSize = 512m -XX: PermSize = 512m tanpa masalah pada Solaris selama beberapa tahun terakhir. Mencoba memindahkannya ke linux dan kami mengalami masalah dengan kesalahan memori acak saat memulai. Kami hanya dapat menjalankannya secara konsisten pada -Xms2300 -Xmx2300 . Kemudian kami diberi tahu tentang hal ini dengan dukungan.
sumber
Batasan JVM 32-bit pada OS 64-bit akan sama persis dengan batasan JVM 32-bit pada OS 32-bit. Bagaimanapun, JVM 32-bit akan berjalan di mesin virtual 32-bit (dalam arti virtualisasi) sehingga ia tidak akan tahu bahwa itu berjalan pada OS / mesin 64-bit.
Satu keuntungan menjalankan JVM 32-bit pada OS 64-bit dibandingkan dengan OS 32-bit adalah Anda dapat memiliki lebih banyak memori fisik, dan oleh karena itu akan lebih jarang mengalami pertukaran / paging. Namun, keuntungan ini hanya benar-benar terwujud ketika Anda memiliki banyak proses.
sumber
Ketika saya bekerja untuk BEA, kami menemukan bahwa rata-rata aplikasi benar-benar berjalan lebih lambat di JVM 64-bit, lalu berjalan lebih lambat di JVM 32-bit. Dalam beberapa kasus, kinerja mencapai 25% lebih lambat. Jadi, kecuali aplikasi Anda benar-benar membutuhkan semua memori ekstra itu, lebih baik Anda menyiapkan lebih banyak server 32-bit.
Seingat saya, tiga alasan teknis paling umum untuk menggunakan 64-bit yang dialami oleh personel layanan profesional BEA adalah:
.
sumber
JROCKIT JVM yang saat ini dimiliki oleh Oracle mendukung penggunaan heap yang tidak bersebelahan, sehingga memungkinkan JVM 32 bit untuk mengakses lebih dari 3,8 GB memori saat JVM berjalan pada OS Windows 64 bit. (2,8 GB saat berjalan pada OS 32 bit).
http://blogs.oracle.com/jrockit/entry/how_to_get_almost_3_gb_heap_on_windows
JVM dapat diunduh secara bebas (perlu registrasi) di
http://www.oracle.com/technetwork/middleware/jrockit/downloads/index.html
sumber
Berikut adalah beberapa pengujian di bawah Solaris dan Linux 64-bit
Solaris 10 - SPARC - Mesin T5220 dengan RAM 32 GB (dan gratis sekitar 9 GB)
BTW: Rupanya Java tidak mengalokasikan banyak memori aktual saat startup. Tampaknya hanya membutuhkan sekitar 100 MB per contoh dimulai (saya mulai 10)
Solaris 10 - x86 - VMWare VM dengan RAM 8 GB (gratis sekitar 3 GB *)
RAM 3 GB gratis tidak benar. Ada sebagian besar RAM yang digunakan cache ZFS, tetapi saya tidak memiliki akses root untuk memeriksa seberapa tepatnya
RedHat 5.5 - x86 - VMWare VM dengan RAM 4 GB (sekitar 3,8 GB digunakan - 200 MB di buffer dan 3,1 GB di cache, jadi gratis sekitar 3 GB)
Mesin yang sama menggunakan JRE 7
sumber
Seharusnya jauh lebih baik
Untuk JVM 32-bit yang berjalan pada host 64-bit, saya membayangkan apa yang tersisa untuk heap adalah ruang virtual apa pun yang tidak terfragmentasi yang tersedia setelah JVM, DLL itu sendiri, dan semua hal kompatibilitas 32-bit OS telah dimuat. Sebagai tebakan liar saya akan berpikir 3GB seharusnya mungkin, tetapi seberapa jauh lebih baik itu tergantung pada seberapa baik Anda melakukannya di tanah tuan rumah 32-bit.
Selain itu, meskipun Anda dapat membuat heap 3GB yang besar, Anda mungkin tidak mau, karena ini akan menyebabkan jeda GC berpotensi menjadi masalah. Beberapa orang hanya menjalankan lebih banyak JVM untuk menggunakan memori ekstra daripada satu memori raksasa. Saya membayangkan mereka sedang menyetel JVM sekarang untuk bekerja lebih baik dengan tumpukan raksasa.
Agak sulit untuk mengetahui dengan tepat seberapa jauh Anda bisa lebih baik. Saya kira situasi 32-bit Anda dapat dengan mudah ditentukan oleh eksperimen. Memang sulit untuk memprediksi secara abstrak, karena banyak faktor di dalamnya, terutama karena ruang virtual yang tersedia pada host 32-bit agak dibatasi .. Heap memang perlu ada dalam memori virtual yang berdekatan, jadi fragmentasi ruang alamat untuk dll dan penggunaan internal ruang alamat oleh kernel OS akan menentukan kisaran alokasi yang memungkinkan.
OS akan menggunakan beberapa ruang alamat untuk memetakan perangkat HW dan alokasi dinamisnya sendiri. Meskipun memori ini tidak dipetakan ke dalam ruang alamat proses java, kernel OS tidak dapat mengaksesnya dan ruang alamat Anda pada saat yang bersamaan, sehingga akan membatasi ukuran ruang virtual program apa pun.
Memuat DLL bergantung pada implementasi dan rilis JVM. Memuat kernel OS tergantung pada sejumlah besar hal, rilis, HW, berapa banyak hal yang telah dipetakan sejauh ini sejak reboot terakhir, siapa tahu ...
Singkatnya
Saya yakin Anda mendapatkan 1-2 GB di tanah 32-bit, dan sekitar 3 di 64-bit, jadi peningkatan keseluruhan sekitar 2x .
sumber
Di Solaris, batasnya sekitar 3,5 GB sejak Solaris 2.5. (sekitar 10 tahun yang lalu)
sumber
Saya mengalami masalah yang sama dengan JVM yang digunakan App Inventor untuk Android Blocks Editor. Ini menyetel heap pada maks. 925m. Ini tidak cukup tetapi saya tidak dapat menyetelnya lebih dari sekitar 1200m, tergantung pada berbagai faktor acak pada mesin saya.
Saya mengunduh Nightly, browser beta 64-bit dari Firefox, dan juga versi JAVA 7 64 bit.
Saya belum menemukan batas heap baru saya, tetapi saya baru saja membuka JVM dengan ukuran heap 5900m . Tidak masalah!
Saya menjalankan Win 7 64 bit Ultimate pada mesin dengan RAM 24 GB.
sumber
Saya telah mencoba mengatur ukuran heap hingga 2200M pada mesin Linux 32bit dan JVM berfungsi dengan baik. JVM tidak dimulai saat saya setel ke 2300M.
sumber
Ini adalah penyetelan yang berat, tetapi Anda bisa mendapatkan tumpukan 3gb.
http://www.microsofttranslator.com/bv.aspx?from=&to=id&a=http://forall.ru-board.com/egor23/online/FAQ/Virtual_Memory/Limits_Virtual_Memory.html
sumber
satu poin lagi di sini untuk hotspot 32-bit JVM: - kapasitas tumpukan asli = 4 Gig - Java Heap - PermGen;
Ini bisa menjadi sangat rumit untuk JVM 32-bit karena Heap Java dan Heap asli sedang bersaing. Semakin besar Java Heap Anda, semakin kecil Heap asli. Mencoba menyiapkan Heap besar untuk VM 32-bit misalnya .2.5 GB + meningkatkan risiko OutOfMemoryError asli bergantung pada footprint aplikasi Anda, jumlah Thread, dll.
sumber
Batasan juga berasal dari fakta bahwa untuk
32 bit
VM,heap
itu sendiri harus dimulai dari alamat nol jika Anda menginginkan semua itu4GB
.Pikirkanlah, jika Anda ingin mereferensikan sesuatu melalui:
yaitu: referensi yang memiliki representasi bit khusus ini, artinya Anda mencoba mengakses memori pertama dari heap. Agar bisa, heap harus dimulai dari alamat nol. Tapi itu tidak pernah terjadi, itu dimulai dengan beberapa offset dari nol:
Karena heap tidak pernah dimulai dari alamat nol di an
OS
, ada beberapa bit yang tidak pernah digunakan dari32
referensi bit, dan karena itu heap yang dapat direferensikan lebih rendah.sumber
Teoritis 4gb, tetapi dalam praktiknya (untuk IBM JVM):
Menangkan 2k8 64, Server Aplikasi IBM Websphere 8.5.5 32bit
C:\IBM\WebSphere\AppServer\bin>managesdk.bat -listAvailable -verbose CWSDK1003I: Доступные SDK: CWSDK1005I: Имя SDK: 1.6_32 - com.ibm.websphere.sdk.version.1.6_32=1.6 - com.ibm.websphere.sdk.bits.1.6_32=32 - com.ibm.websphere.sdk.location.1.6_32=${WAS_INSTALL_ROOT}/java - com.ibm.websphere.sdk.platform.1.6_32=windows - com.ibm.websphere.sdk.architecture.1.6_32=x86_32 - com.ibm.websphere.sdk.nativeLibPath.1.6_32=${WAS_INSTALL_ROOT}/lib/native/win /x86_32/ CWSDK1001I: Задача managesdk выполнена успешно. C:\IBM\WebSphere\AppServer\java\bin>java -Xmx2036 MaxMemory JVMJ9GC017E -Xmx слишком мала, должна быть не меньше 1 M байт JVMJ9VM015W Ошибка инициализации для библиотеки j9gc26(2): Не удалось инициализи ровать Could not create the Java virtual machine. C:\IBM\WebSphere\AppServer\java\bin>java -Xmx2047M MaxMemory Total Memory: 4194304 (4.0 MiB) Max Memory: 2146435072 (2047.0 MiB) Free Memory: 3064536 (2.9225692749023438 MiB) C:\IBM\WebSphere\AppServer\java\bin>java -Xmx2048M MaxMemory JVMJ9VM015W Ошибка инициализации для библиотеки j9gc26(2): Не удалось создать эк земпляр кучи; запрошено 2G Could not create the Java virtual machine.
RHEL 6.4 64, Server Aplikasi IBM Websphere 8.5.5 32bit
[bin]./java -Xmx3791M MaxMemory Total Memory: 4194304 (4.0 MiB) Max Memory: 3975151616 (3791.0 MiB) Free Memory: 3232992 (3.083221435546875 MiB) [root@nagios1p bin]# ./java -Xmx3793M MaxMemory Total Memory: 4194304 (4.0 MiB) Max Memory: 3977248768 (3793.0 MiB) Free Memory: 3232992 (3.083221435546875 MiB) [bin]# /opt/IBM/WebSphere/AppServer/bin/managesdk.sh -listAvailable -verbose CWSDK1003I: Available SDKs : CWSDK1005I: SDK name: 1.6_32 - com.ibm.websphere.sdk.version.1.6_32=1.6 - com.ibm.websphere.sdk.bits.1.6_32=32 - com.ibm.websphere.sdk.location.1.6_32=${WAS_INSTALL_ROOT}/java - com.ibm.websphere.sdk.platform.1.6_32=linux - com.ibm.websphere.sdk.architecture.1.6_32=x86_32 -com.ibm.websphere.sdk.nativeLibPath.1.6_32=${WAS_INSTALL_ROOT}/lib/native/linux/x86_32/ CWSDK1001I: Successfully performed the requested managesdk task.
sumber