Xmxsize default di Java 8 (ukuran heap maks)

Dalam dokumentasi Oracle saya menemukan:

-Xmxsize Menentukan ukuran maksimum (dalam byte) dari kumpulan alokasi memori dalam byte ... Nilai default dipilih saat runtime berdasarkan konfigurasi sistem.

Apa yang dimaksud dengan konfigurasi sistem?


person Vitaly    schedule 02.02.2015    source sumber
comment
Artinya jika sistem Anda memiliki RAM 16 GB, ukurannya akan lebih besar dibandingkan jika sistem Anda memiliki 512 MB.   -  person JB Nizet    schedule 02.02.2015
comment
Terima kasih, seberapa besar?   -  person Vitaly    schedule 02.02.2015
comment
Cari ukuran heap maksimum di sini   -  person Nir Alfasi    schedule 02.02.2015
comment
››Lebih kecil dari 1/4 memori fisik atau 1 GB. Terima kasih @alfasin.   -  person Vitaly    schedule 02.02.2015
comment
Oracle.com/technetwork/java/ergo5-140223.html   -  person jmj    schedule 02.02.2015
comment
@Vitaly Batas 1Gb sepertinya tidak berlaku untuk -Xmx, setidaknya di Java 8, karena pada sistem linux 64bit saya, dengan total memori 6Gb, saya memiliki jvm yang memiliki -Xmx = 1.5Gb, secara default.   -  person user218867    schedule 18.01.2017
comment
@Vitaly mohon diperhatikan bahwa jawaban Anda adalah untuk Java SE5. Dari SE8, ukuran heap maksimum adalah 256mb secara default untuk klien jvm.   -  person Vyshnav Ramesh Thrissur    schedule 08.05.2019
comment
@Eric Wang Anda mungkin menggunakan server jvm daripada klien jvm. Server jvm dapat memiliki ukuran heap maksimal 1 GB atau 32 GB secara default tergantung pada ram   -  person Vyshnav Ramesh Thrissur    schedule 08.05.2019
comment
Apakah ini menjawab pertanyaan Anda? Bagaimana ukuran heap Java maks default ditentukan?   -  person rogerdpack    schedule 06.04.2020


Jawaban (5)


Hal ini bervariasi tergantung implementasi dan versinya, namun biasanya bergantung pada VM yang digunakan (misalnya klien atau server, lihat parameter -client dan -server) dan pada memori sistem Anda.

Seringkali untuk client nilai defaultnya adalah 1/4 dari memori fisik Anda atau 1GB (mana yang lebih kecil).

Opsi konfigurasi Java juga (parameter baris perintah) dapat "dialihdayakan" ke variabel lingkungan termasuk -Xmx, yang dapat mengubah default (artinya menentukan default baru). Khususnya variabel lingkungan JAVA_TOOL_OPTIONS diperiksa oleh semua alat Java dan digunakan jika ada (detail lebih lanjut di sini dan di sini).

Anda dapat menjalankan perintah berikut untuk melihat nilai default:

java -XX:+PrintFlagsFinal -version

Ini memberi Anda daftar yang sangat panjang, -Xmx ada di MaxHeapSize, -Xms ada di InitialHeapSize. Filter keluaran Anda (misalnya |grep di linux) atau simpan dalam file sehingga Anda dapat mencari di dalamnya.

person icza    schedule 02.02.2015
comment
Sebagai tambahan kecil, Anda dapat menjalankan java -XX:+PrintCommandLineFlags untuk mencetak ukuran heap (dan informasi lainnya) yang dipilih oleh JVM berdasarkan informasi sistem saat ini - person Cristian Vat; 02.02.2015
comment
@CristianVat Ya, tetapi parameternya adalah -XX:+PrintFlagsFinal, yang Anda sarankan tidak berfungsi untuk saya. Menambahkannya ke jawabannya. - person icza; 02.02.2015
comment
Benar, maaf -XX:+PrintFlagsFinal adalah opsi terbaik karena ini akan menampilkan semua informasi setelah semuanya diperhitungkan (termasuk opsi manual dan ergonomis). Meskipun -XX:+PrintCommandLineFlags tampaknya berfungsi di JVM saya (mungkin bergantung pada versi persisnya) - person Cristian Vat; 02.02.2015
comment
Untuk kotak besar, aturan praktis 1/4 RAM ini jelas tidak berlaku. Pada 4 soket, 64 GB per server soket (yaitu RAM 256 GB), Xmx defaultnya adalah ~32 GB. 32gb mungkin terkait dengan keterbatasan CompressedOops yang ada pada saat ini juga. - person FauxFaux; 12.11.2015
comment
Ini hanya mencetak baris terkait ukuran heap: java -XX:+PrintFlagsFinal -version | grep HeapSize - person user218867; 18.01.2017
comment
Apakah ada cara untuk mengubah nilai rasio 1/4 itu sendiri daripada nilai Xmx? Ini akan membantu dalam skenario dalam container dengan tanda -XX:+UseCGroupMemoryLimitForHeap aktif. - person xmar; 20.03.2019
comment
@icza Saya yakin 1/4 sesuai dengan jvm klien dan 1gb sesuai dengan jvm server dengan memori fisik 4gb/lebih. Dan 32GB untuk server jvm dengan memori fisik 128GB/lebih. Mohon koreksi saya jika saya salah - person Vyshnav Ramesh Thrissur; 08.05.2019
comment
@VyshnavRameshThrissur Mungkin saja. Apakah Anda memiliki sumber (tautan) untuk mengonfirmasi? - person icza; 09.05.2019
comment
@icza saya telah mempostingnya sebagai jawaban di bawah ini. Silakan melihatnya. stackoverflow.com/a/56036202/5649620 - person Vyshnav Ramesh Thrissur; 09.05.2019

Seperti yang telah Anda sebutkan, -Xmxsize default (Ukuran Heap Maksimum) bergantung pada konfigurasi sistem Anda.

Java8 client membutuhkan 1/64 memori fisik lebih besar untuk Xmssize (Ukuran Tumpukan Minimum) dan Lebih kecil 1/4 memori fisik untuk -Xmxsize (Ukuran Tumpukan Maksimum).

Artinya jika Anda memiliki memori fisik RAM 8GB, Anda akan memiliki Xmssize Lebih Besar dari 8*(1/64) dan Lebih Kecil dari -Xmxsizeas 8*(1/4).

Anda dapat Memeriksa HeapSize default Anda dengan

Di Windows:

java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"

Di Linux:

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

Nilai default ini juga dapat diubah ke jumlah yang Anda inginkan.

person Sarat Chandra    schedule 12.04.2017
comment
Referensi: docs.Oracle.com/ javase/8/docs/technotes/guides/vm/gctuning/ - person kisna; 20.01.2018
comment
docs.Oracle.com/javase/8/ docs/technotes/guides/vm/ sesuai tautan ini, default untuk minimum/awal adalah 1/64 bukan 1/6. Lebih besar dari 1/64 memori fisik mesin pada mesin atau jumlah minimum yang wajar - person Vyshnav Ramesh Thrissur; 08.05.2019

Anehnya pertanyaan ini tidak memiliki jawaban pasti yang terdokumentasi. Mungkin titik data lain akan memberikan nilai bagi orang lain yang mencari jawaban. Pada sistem saya yang menjalankan CentOS (6.8,7.3) dan Java 8 (build 1.8.0_60-b27, Server 64-Bit):

memori default adalah 1/4 dari memori fisik, tidak dibatasi oleh 1GB.

Juga, -XX:+PrintFlagsFinal mencetak ke STDERR sehingga perintah untuk menentukan memori default saat ini yang disajikan oleh orang lain di atas harus diubah menjadi yang berikut:

java -XX:+PrintFlagsFinal 2>&1 | grep MaxHeapSize

Berikut ini dikembalikan pada sistem dengan RAM fisik 64GB:

uintx MaxHeapSize                                  := 16873684992      {product}
person brianNotBob    schedule 27.01.2017
comment
Di sistem saya dengan RAM 16 Gb: 2069889024 = 2 Gb. - person david.perez; 07.02.2017
comment
Windows 7 64bit dengan 8 GB RAM: JVM 32bit: 256 MB, JVM 64bit: 2 GB - person golimar; 22.02.2017
comment
Akhirnya menemukan dokumentasinya: stackoverflow.com/a/56036202/32453 - person rogerdpack; 06.04.2020

Di VM Ubuntu saya, dengan total RAM 1048 MB, java -XX:+PrintFlagsFinal -version | grep HeapSize dicetak: uintx MaxHeapSize := 266338304, yaitu kira-kira 266MB dan merupakan 1/4 dari total RAM saya.

person Binita Bharati    schedule 27.04.2018
comment
Bagi saya sepertinya OpenJDK dan Oracle memiliki karakteristik yang berbeda - Saya melihat OpenJDK menggunakan 1/4 RAM sebagai -Xmx setiap saat (tidak pernah lebih kecil dari 1/4 dan 1GB) - person pogul; 20.08.2018

Pada 8 Mei 2019:

Ukuran heap JVM bergantung pada konfigurasi sistem, artinya:

a) jvm klien vs jvm server

b) 32bit vs 64bit.

Tautan:

1) pembaruan dari J2SE5.0: https://docs.Oracle.com/javase/6/docs/technotes/guides/vm/gc-ergonomics.html
2) jawaban singkat: https://docs.Oracle.com/javase/8/docs/technotes/guides/vm/gctuning/ergonomics.html
3) jawaban terperinci: https://docs.Oracle.com/javase/8/docs/technotes/guides/vm/gctuning/parallel.html#default_heap_size
4) klien vs server: https://www.javacodegeeks.com/2011/07/jvm-options-client-vs-server.html

Ringkasan: (Sulit untuk memahaminya dari tautan di atas. Jadi, rangkumlah di sini)

1) Ukuran heap maksimum default untuk Klien jvm adalah 256mb (ada pengecualian, baca dari tautan di atas).

2) Ukuran heap maksimum default untuk Server jvm 32bit adalah 1gb dan 64 bit adalah 32gb (sekali lagi ada pengecualian di sini juga. Silakan membacanya dari tautan).

Jadi ukuran heap jvm maksimum default adalah: 256mb atau 1gb atau 32gb bergantung pada VM, di atas.

person Vyshnav Ramesh Thrissur    schedule 08.05.2019
comment
Akhirnya tautan ke dokumen nyata yang menjelaskan apa yang sedang terjadi. - person rogerdpack; 06.04.2020