Bagaimana ukuran maksimum heap Java max ditentukan?


421

Jika saya menghilangkan -Xmxnopsi 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?


1
konfigurasi sistem berarti: a) klien jvm vs server jvm b) 32bit vs 64bit. Tautan: 1) pembaruan dari J2SE5.0 docs.oracle.com/javase/6/docs/technotes/guides/vm/… 2) jawaban singkat: docs.oracle.com/javase/8/docs/technotes/guides/vm / gctuning / ... 3) jawaban terperinci: docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/… 4) client vs server: javacodegeeks.com/2011/07/jvm-options-client- vs-server.html
Vyshnav Ramesh Thrissur

2
sulit dipahami dari tautan di atas. Jadi meringkasnya di sini: Ukuran tumpukan maksimum untuk Klien jvm adalah 256mb (ada pengecualian, baca dari tautan di atas). Ukuran tumpukan Maximun untuk Server jvm dari 32bit adalah 1gb dan 64 bit adalah 32gb (sekali lagi ada pengecualian di sini juga. Mohon baca dari tautan). Jadi 256mb atau 1gb atau 32gb
Vyshnav Ramesh Thrissur

Jawaban:


507

Pada Windows, Anda dapat menggunakan perintah berikut untuk mencari tahu default di sistem tempat aplikasi Anda berjalan.

java -XX: + PrintFlagsFinal -version | findstr HeapSize

Cari opsi MaxHeapSize(untuk -Xmx) dan InitialHeapSizeuntuk -Xms.

Pada sistem Unix / Linux, Anda bisa melakukannya

java -XX: + PrintFlagsFinal -version | grep HeapSize

Saya percaya output yang dihasilkan dalam byte.


3
Saya berharap untuk opsi yang bagus seperti ini, tetapi tidak berhasil bagi saya menggunakan Java 6 VM IBM.
Matt Lavin

Bagus! Bisakah saya bermain dengan semua opsi default ini? Apa variabel ENV yang sesuai untuk masing-masing?
Elist

28
Dalam kasus saya di Linux, InitialHeapSize = 262803264dan MaxHeapSize = 4206886912itu adalah sekitar 256 MB dan 4 GB jika saya tidak salah. Apakah ini berarti bahwa setiap JVM dimulai seolah-olah diluncurkan dengan -Xms256m -Xmx4gopsi?
Yuriy Nakonechnyy

9
Pada sistem Windows:java -XX:+PrintFlagsFinal -version | findstr /R /C:"HeapSize"
sp00m

1
@matanster Di Linux saya -versionmenekan teks "penggunaan" yang panjang stderr.
Franklin Yu

115

Untuk Java SE 5: Menurut Ergonomi Kolektor Sampah [Oracle] :

ukuran tumpukan awal:

Lebih besar dari 1/64 memori fisik mesin pada mesin atau minimum yang masuk akal. Sebelum J2SE 5.0, ukuran heap awal default adalah minimum yang masuk akal, yang bervariasi berdasarkan platform. Anda dapat mengganti default ini menggunakan opsi -Xms command-line.

ukuran tumpukan maksimum:

Lebih kecil dari 1/4 memori fisik atau 1GB. Sebelum J2SE 5.0, ukuran heap maksimum default adalah 64MB. Anda dapat menimpa default ini menggunakan opsi -Xmx command-line.

MEMPERBARUI:

Seperti yang ditunjukkan oleh Tom Anderson dalam komentarnya, di atas adalah untuk mesin kelas server. Dari Ergonomi di 5.0 JavaTM Virtual Machine :

Dalam platform J2SE versi 5.0 kelas mesin yang disebut sebagai mesin kelas server telah didefinisikan sebagai mesin dengan

  • 2 atau lebih prosesor fisik
  • Memori fisik 2 atau lebih Gbytes

dengan pengecualian platform 32 bit yang menjalankan versi sistem operasi Windows. Pada semua platform lain, nilai default sama dengan nilai default untuk versi 1.4.2.

Dalam platform J2SE versi 1.4.2 secara default, pilihan berikut dibuat

  • ukuran awal tumpukan 4 Mbyte
  • ukuran tumpukan maksimum 64 Mbyte

4
Peringatan: itu untuk mesin kelas server, bukan kelas klien. Anda perlu membaca dokumen itu bersama dengan java.sun.com/docs/hotspot/gc5.0/ergo5.html yang mendefinisikan istilah-istilah tersebut dan apa yang terjadi pada mesin kelas klien. dogbane, mungkin saya dengan rendah hati menyarankan Anda mengedit jawaban Anda untuk mengutip bagian yang relevan?
Tom Anderson

3
Itu adalah standar yang sangat rendah pada tahun 2012. Sangat sedikit aplikasi serius yang muat di dalam 64 megabita.
Mark E. Haase

1
Lihat jawaban Ernesto 30 Okt 2012 untuk mesin klien setelah pembaruan Java 6 18.
Andy Thomas

Juga perlu diingat bahwa dikatakan: "Batas dan fraksi yang diberikan untuk ukuran heap benar untuk J2SE 5.0. Mereka mungkin berbeda dalam rilis berikutnya karena komputer menjadi lebih kuat."
Lodovik

Omong-omong, algo ini hanya untuk Pengumpul Sampah Paralel.
Mike Argyriou

45

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 :

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

Di Linux :

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

Pengaturan konfigurasi sistem apa yang memengaruhi nilai default?

Memori fisik mesin & versi Java.


5
bukan 1/64 bukan 1/6?
Vyshnav Ramesh Thrissur

1
Yeah Xmssize (Minimum HeapSize / InitialHeapSize) lebih dari 1/64 memori fisik Anda & Xmxsize (Maximum HeapSize / MaxHeapSize) kurang dari 1/4 dari memori fisik Anda. (Sebagai contoh untuk mac saya, memiliki ram 16GB, saya mendapatkan uintx InitialHeapSize: = 268435456 {product} uintx MaxHeapSize: = 4294967296 {produk}, i, e Xms adalah 268 MB & Xmx adalah 4,29 GB
sjethvani

1
Harap edit jawabannya. Ini 1/64, bukan 1/6.
emeraldhieu

35

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.


8
Salah, halaman yang ditautkan mengatakangreater than or equal to 1 gigabyte of physical memory results in a maximum heap size of 256 megabytes
Paolo Fulgoni

5
Saya baru saja memeriksa mesin linux dengan memori fisik 5GB. Tumpukan maks bawaan ditampilkan sebagai 1.5gb
ernesto

1
@ PaoloFulgoni no, contoh praktis lain yang saya amati saat ini: 129 Gbytes hasil memori fisik dalam 32 Gbyte ukuran tumpukan maksimum
Kirill

Lihat jawaban apl untuk alasan ini benar: stackoverflow.com/a/13310792/32453 Lihat juga stackoverflow.com/a/56036202/32453
rogerdpack

16

Ernesto benar. Menurut tautan yang dia posting [1]:

Konfigurasi tumpukan JVM Klien yang diperbarui

Di JVM Klien ...

  • Ukuran tumpukan maksimum default adalah setengah dari memori fisik hingga ukuran memori fisik 192 megabyte dan jika tidak seperempat dari memori fisik hingga ukuran memori fisik 1 gigabyte.

    Misalnya, jika mesin Anda memiliki 128 megabyte memori fisik, maka ukuran heap maksimum adalah 64 megabyte, dan lebih besar dari atau sama dengan 1 gigabyte memori fisik menghasilkan ukuran heap maksimum 256 megabyte.

  • Ukuran heap maksimum sebenarnya tidak digunakan oleh JVM kecuali jika program Anda membuat objek yang cukup untuk membutuhkannya. Jumlah yang jauh lebih kecil, disebut ukuran tumpukan awal, dialokasikan selama inisialisasi JVM. ...

  • ...
  • Ergonomi konfigurasi tumpukan server JVM sekarang sama dengan Klien, kecuali bahwa ukuran heap maksimum default untuk JVM 32-bit adalah 1 gigabyte , sesuai dengan ukuran memori fisik 4 gigabyte, dan untuk JVM 64-bit adalah 32 gigabyte , sesuai ke ukuran memori fisik 128 gigabytes.

[1] http://www.oracle.com/technetwork/java/javase/6u18-142093.html



8

Akhirnya!

Pada Java 8u191 Anda sekarang memiliki opsi:

-XX:InitialRAMPercentage
-XX:MaxRAMPercentage
-XX:MinRAMPercentage

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 MaxRAMPercentageadalah 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 MaxRAMPercentageopsi terlihat seperti ini:

java -XX:MaxRAMPercentage=75.0  ....

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".


7

nilai default dipilih pada saat runtime berdasarkan pada konfigurasi sistem

Lihat halaman dokumentasi

Ukuran Tumpukan Default

Kecuali jika ukuran heap awal dan maksimum ditentukan pada baris perintah, mereka dihitung berdasarkan jumlah memori pada mesin.

  1. 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) .

  2. 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

Pengaturan konfigurasi sistem apa yang memengaruhi nilai default?

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


5

The Xmsdan Xmxyang bendera mesin virtual Java (JVM):

  • Xms: initial and minimumJVMheap 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 <= 16MB
    • Typical Size:
      • -Xms128M
      • -Xms256M
      • -Xms512M
    • Function/ Effect:
      • -> JVM mulai dengan mengalokasikan Xmsmemori ukuran
  • Xmx: maximumJVMheap 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:
      • -> JVM memungkinkan penggunaan Xmxmemori ukuran maksimal
        • bila melebihi Xmx, akanjava.lang.OutOfMemoryError
          • Bagaimana cara memperbaikinya OutOfMemoryError?
            • melebihi Xmxnilai
              • mis: dari -Xmx4gke-Xmx8g

Lebih detail

lihat dokumen resmi: -X Opsi baris perintah


Bukankah itu untuk JRockit JVM? (berbeda dengan Oracle's Hotspot JVM)
peterh

4

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 -Xmxopsi. Jika nilai -Xmsparameter lebih kecil dari nilai -Xmxparameter, 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.

masukkan deskripsi gambar di sini

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:

  • Kecuali jika Anda memiliki masalah dengan jeda, coba berikan memori sebanyak mungkin ke mesin virtual. Ukuran default (64MB) seringkali terlalu kecil.
  • Pengaturan -Xms dan -Xmx ke nilai yang sama meningkatkan prediktabilitas dengan menghapus keputusan ukuran paling penting dari mesin virtual. Namun, mesin virtual kemudian tidak dapat memberikan kompensasi jika Anda membuat pilihan yang buruk.
  • Secara umum, tambah memori saat Anda menambah jumlah prosesor, karena alokasi dapat diparalelkan.

    Ada artikel lengkapnya

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.