Bagaimana cara mengatur penggunaan memori maksimum untuk JVM?

132

Saya ingin membatasi memori maksimum yang digunakan oleh JVM. Catatan, ini bukan hanya tumpukan, saya ingin membatasi total memori yang digunakan oleh proses ini.

erotsppa
sumber

Jawaban:

94

gunakan argumennya -Xms<memory> -Xmx<memory>. Gunakan Matau Gsetelah angka untuk menunjukkan masing-masing Meg dan Gigs dari byte. -Xmsmenunjukkan minimum dan -Xmxmaksimum.

Prabhu R
sumber
1
Anda mungkin ingin melihat MaxPermSize juga.
urmalp
89
dia bertanya tentang memori JVM. Apa yang Anda katakan adalah ukuran tumpukan. Mereka berdua berbeda
vsingh
8
Untuk mengulangi apa yang disebutkan komentar lain, Xms dan Xmx hanya mengkonfigurasi heap. Meskipun mengonfigurasikan variabel-variabel ini memiliki efek tidak langsung pada ruang non-heap, orang yang mengajukan pertanyaan sedang mencoba menetapkan apakah ada cara untuk mengkonfigurasi total penggunaan memori (heap + non-heap)
murungu
2
uhu. jadi saya atur -Xmx524Mdan prosesnya memakan 1,2 GB RAM. (?)
phil294
7
Ini bukan jawaban yang benar, opsi -Xms dan -Xmx hanya mengatur ukuran tumpukan jvm, bukan alokasi memori total.
Peter De Winter
31

Anda tidak perlu khawatir tentang tumpukan memori yang bocor (sangat jarang terjadi). Satu-satunya saat Anda dapat membuat tumpukan keluar dari kendali adalah dengan rekursi tak terbatas (atau sangat dalam).

Ini hanya tumpukan. Maaf, tidak membaca pertanyaan Anda sepenuhnya pada awalnya.

Anda perlu menjalankan JVM dengan argumen baris perintah berikut.

-Xmx<ammount of memory>

Contoh:

-Xmx1024m

Itu akan memungkinkan maks 1GB memori untuk JVM.

jjnguy
sumber
1
Itu tidak benar, menurut thread ini, ada beberapa cara Anda dapat bocor di luar tumpukan stackoverflow.com/questions/1475290/...
erotsppa
Anda benar, ada banyak cara untuk memiliki masalah memori yang tidak berkaitan dengan stack. Namun, mereka tidak terlalu umum.
jjnguy
9
Cukup yakin Anda tidak dapat mengontrol ukuran memori non-tumpukan, bukan?
matt b
Cukup yakin Anda bisa mengendalikannya via -XX:MaxDirectMemorySize. Bukannya saya sudah membuat banyak profil untuk memastikan tapi tetap;)
alexandergunnarson
2
@alexandergunnarson Satu- MaxDirectMemorySizesatunya yang memengaruhi buffer NIO. Semua jenis memori asli lainnya digunakan oleh JVM.
Christopher Schultz
16

Jika Anda ingin membatasi memori untuk jvm (bukan ukuran heap) ulimit -v

Untuk mendapatkan gambaran tentang perbedaan antara jvm dan memori tumpukan, lihat artikel yang sangat bagus ini http://blogs.vmware.com/apps/2011/06/taking-a-closer-look-at-sizing-the- java-process.html

vsingh
sumber
8
Apakah ulimitperintah Linux? Saya melakukan pencarian Google cepat dan tidak melihat hubungan antara ulimitdan JVM. Y
Sam
11

Jawaban di atas agak benar, Anda tidak dapat dengan anggun mengontrol berapa banyak memori asli yang dialokasikan oleh proses java. Tergantung pada apa aplikasi Anda lakukan.

Yang mengatakan, tergantung pada platform, Anda mungkin dapat menggunakan beberapa mekanisme, misalnya misalnya, untuk membatasi ukuran java atau proses lainnya.

Tapi jangan berharap itu gagal dengan anggun jika itu mencapai batas itu. Kegagalan alokasi memori asli jauh lebih sulit untuk ditangani daripada kegagalan alokasi pada heap java. Ada peluang yang cukup bagus untuk aplikasi tersebut macet tetapi tergantung pada seberapa kritisnya sistem untuk menjaga ukuran proses turun yang mungkin masih cocok untuk Anda.

SmoothieMonster
sumber
1

NativeHeap dapat ditingkatkan dengan -XX: MaxDirectMemorySize = 256M (standarnya adalah 128)

Saya tidak pernah menggunakannya. Mungkin Anda akan merasakan manfaatnya.

Mario Trucco
sumber
1
Saya ragu bahwa op menginginkan ini: memori asli digunakan ketika Anda melakukan panggilan ke kode C / C ++ dari java.
om-nom-nom
6
memori asli juga digunakan saat melakukan panggilan nio jika Anda mengalokasikan buffer dengan memori langsung. (... dan classloader, dan informasi utas ....)
stu