Jika saya menghilangkan -Xmxn
opsi dari baris perintah Java maka nilai default akan digunakan. Menurut dokumentasi Java
"nilai default dipilih saat runtime berdasarkan pada konfigurasi sistem"
Pengaturan konfigurasi sistem apa yang memengaruhi nilai default?
java
heap
heap-memory
Richard Dorman
sumber
sumber
Jawaban:
Pada Windows, Anda dapat menggunakan perintah berikut untuk mencari tahu default di sistem tempat aplikasi Anda berjalan.
Cari opsi
MaxHeapSize
(untuk-Xmx
) danInitialHeapSize
untuk-Xms
.Pada sistem Unix / Linux, Anda bisa melakukannya
Saya percaya output yang dihasilkan dalam byte.
sumber
InitialHeapSize = 262803264
danMaxHeapSize = 4206886912
itu adalah sekitar 256 MB dan 4 GB jika saya tidak salah. Apakah ini berarti bahwa setiap JVM dimulai seolah-olah diluncurkan dengan-Xms256m -Xmx4g
opsi?java -XX:+PrintFlagsFinal -version | findstr /R /C:"HeapSize"
-version
menekan teks "penggunaan" yang panjangstderr
.Untuk Java SE 5: Menurut Ergonomi Kolektor Sampah [Oracle] :
MEMPERBARUI:
Seperti yang ditunjukkan oleh Tom Anderson dalam komentarnya, di atas adalah untuk mesin kelas server. Dari Ergonomi di 5.0 JavaTM Virtual Machine :
sumber
Java 8 membutuhkan waktu lebih dari 1/64 dari memori fisik Anda untuk Anda xmssize (Minimum HeapSize) dan kurang dari 1 / 4th dari memori fisik Anda untuk Anda -Xmxsize (Maximum HeapSize).
Anda dapat memeriksa ukuran tumpukan Java default dengan:
Di Windows :
Di Linux :
Memori fisik mesin & versi Java.
sumber
Ini diubah dalam pembaruan Java 6 18 .
Dengan asumsi bahwa kami memiliki lebih dari 1 GB memori fisik (sangat umum hari ini), selalu 1/4 dari memori fisik Anda untuk server vm.
sumber
greater than or equal to 1 gigabyte of physical memory results in a maximum heap size of 256 megabytes
Ernesto benar. Menurut tautan yang dia posting [1]:
[1] http://www.oracle.com/technetwork/java/javase/6u18-142093.html
sumber
Untuk IBM JVM, perintahnya adalah sebagai berikut:
Untuk informasi lebih lanjut tentang IBM SDK untuk Java 8: http://www-01.ibm.com/support/knowledgecenter/SSYKE2_8.0.0/com.ibm.java.lnx.80.doc/diag/appendixes/defaults.html ? lang = id
sumber
Akhirnya!
Pada Java 8u191 Anda sekarang memiliki opsi:
yang dapat digunakan untuk mengukur tumpukan sebagai persentase dari RAM fisik yang dapat digunakan. (yang sama dengan RAM yang diinstal kurang dari apa yang digunakan kernel).
Lihat Catatan Rilis untuk Java8 u191 untuk informasi lebih lanjut. Perhatikan bahwa opsi disebutkan di bawah judul Docker tetapi sebenarnya mereka berlaku apakah Anda berada di lingkungan Docker atau di lingkungan tradisional.
Nilai default untuk
MaxRAMPercentage
adalah 25%. Ini sangat konservatif.Aturan saya sendiri: Jika host Anda lebih atau kurang didedikasikan untuk menjalankan aplikasi java yang diberikan, maka Anda dapat tanpa masalah meningkat secara dramatis. Jika Anda menggunakan Linux, hanya menjalankan daemon standar dan telah menginstal RAM dari sekitar 1 Gb ke atas maka saya tidak akan ragu untuk menggunakan 75% untuk tumpukan JVM. Sekali lagi, ingat bahwa ini adalah 75% dari RAM yang tersedia , bukan RAM yang dipasang . Yang tersisa adalah proses tanah pengguna lain yang mungkin berjalan pada host dan jenis memori lain yang dibutuhkan JVM (misalnya untuk stack). Secara keseluruhan, ini biasanya akan cocok dengan 25% yang tersisa. Jelas, dengan RAM yang diinstal lebih banyak lagi, 75% adalah taruhan yang lebih aman dan lebih aman. (Saya berharap orang-orang JDK telah menerapkan opsi di mana Anda dapat menentukan tangga)
Pengaturan
MaxRAMPercentage
opsi terlihat seperti ini:Perhatikan bahwa nilai persentase ini adalah tipe 'ganda' dan karena itu Anda harus menentukannya dengan titik desimal. Anda mendapatkan kesalahan yang agak aneh jika Anda menggunakan "75" bukannya "75.0".
sumber
Lihat halaman dokumentasi
Ukuran Awal Inap dan Maksimum Klien JVM Klien:
Ukuran tumpukan maksimum default adalah setengah dari memori fisik hingga ukuran memori fisik 192 megabyte (MB) dan jika tidak seperempat dari memori fisik hingga ukuran memori fisik 1 gigabyte (GB) .
Server JVM Default Initial dan Maximum Heap Sizes:
Pada JVM 32-bit, ukuran heap maksimum default dapat mencapai 1 GB jika ada 4 GB atau lebih memori fisik . Pada JVM 64-bit, ukuran heap maksimum default bisa mencapai 32 GB jika ada 128 GB atau lebih memori fisik
Anda dapat menentukan ukuran heap awal dan maksimum menggunakan flag -Xms (ukuran heap awal) dan -Xmx (ukuran heap maksimum). Jika Anda tahu berapa banyak tumpukan aplikasi Anda perlu bekerja dengan baik, Anda dapat mengatur -Xms dan -Xmx dengan nilai yang sama
sumber
The
Xms
danXmx
yang bendera mesin virtual Java (JVM):Xms
:initial and minimum
JVMheap size
Format
:-Xmx<size>[g|G|m|M|k|K]
Default Size
:-server
mode: 25% dari memori fisik gratis,> = 8MB dan <= 64MB-client mode
: 25% dari memori fisik gratis,> = 8MB dan <= 16MBTypical Size
:-Xms128M
-Xms256M
-Xms512M
Function
/Effect
:Xms
memori ukuranXmx
:maximum
JVMheap size
Format
:-Xmx<size>[g|G|m|M|k|K]
Default Size
:<= R27.2
Windows
:75%
dari total memori fisik hingga1GB
Linux/Solaris
:50%
dari memori fisik yang tersedia hingga1GB
>= R27.3
Windows X64
:75%
dari total memori fisik hingga2GB
Linux/Solaris X64
:50%
dari memori fisik yang tersedia hingga2GB
Windows x86
:75%
dari total memori fisik hingga1GB
Linux/Solaris X86
:50%
dari memori fisik yang tersedia hingga1GB
Typical Size
:-Xmx1g
-Xmx2084M
-Xmx4g
-Xmx6g
-Xmx8g
Function
/Effect
:Xmx
memori ukuran maksimalXmx
, akanjava.lang.OutOfMemoryError
OutOfMemoryError
?Xmx
nilai-Xmx4g
ke-Xmx8g
Lebih detail
lihat dokumen resmi: -X Opsi baris perintah
sumber
Sejumlah parameter mempengaruhi ukuran generasi. Diagram berikut menggambarkan perbedaan antara ruang yang dikomit dan ruang virtual di heap. Pada inisialisasi mesin virtual, seluruh ruang untuk heap dicadangkan. Ukuran ruang yang dipesan dapat ditentukan dengan
-Xmx
opsi. Jika nilai-Xms
parameter lebih kecil dari nilai-Xmx
parameter, tidak semua ruang yang dicadangkan segera berkomitmen ke mesin virtual. Ruang yang tidak terikat diberi label "virtual" pada gambar ini. Berbagai bagian tumpukan (generasi permanen, generasi bertenor, dan generasi muda) dapat tumbuh hingga batas ruang virtual sesuai kebutuhan.Secara default, mesin virtual menumbuhkan atau mengecilkan tumpukan di setiap koleksi untuk mencoba menjaga proporsi ruang bebas untuk benda hidup di setiap koleksi dalam rentang tertentu. Rentang target ini ditetapkan sebagai persentase berdasarkan parameter -
XX:MinHeapFreeRatio=<minimum>
dan-XX:MaxHeapFreeRatio=<maximum>
, dan ukuran total dibatasi di bawah ini oleh-Xms<min>
dan di atas oleh-Xmx<max>
.Nilai Default Parameter
MinHeapFreeRatio 40
MaxHeapFreeRatio 70
-Xms 3670k
-Xmx 64m
Nilai default parameter ukuran tumpukan pada sistem 64-bit telah ditingkatkan sekitar 30%. Peningkatan ini dimaksudkan untuk mengimbangi ukuran objek yang lebih besar pada sistem 64-bit.
Dengan parameter ini, jika persentase ruang kosong dalam satu generasi turun di bawah 40%, generasi akan diperluas untuk mempertahankan ruang kosong 40%, hingga ukuran maksimum yang diizinkan dari generasi tersebut. Demikian pula, jika ruang bebas melebihi 70%, pembangkitan akan dikontrak sehingga hanya 70% dari ruang bebas, tergantung pada ukuran minimum generasi.
Aplikasi server besar sering mengalami dua masalah dengan standar ini. Salah satunya adalah startup lambat, karena tumpukan awal kecil dan harus diubah ukurannya pada banyak koleksi utama. Masalah yang lebih mendesak adalah bahwa ukuran tumpukan maksimum default terlalu kecil untuk sebagian besar aplikasi server. Aturan praktis untuk aplikasi server adalah:
Secara umum, tambah memori saat Anda menambah jumlah prosesor, karena alokasi dapat diparalelkan.
Ada artikel lengkapnya
sumber