Meningkatkan ukuran heap maksimum JVM untuk aplikasi intensif memori

88

Saya perlu menjalankan aplikasi intensif memori Java yang menggunakan lebih dari 2GB, tetapi saya mengalami masalah untuk meningkatkan ukuran maksimum heap. Sejauh ini, saya telah mencoba pendekatan berikut:

  • Menyetel parameter -Xmx, mis. -Xmx3000m. Pendekatan ini gagal saat pembuatan JVM. Dari apa yang saya googling, sepertinya -Xmx harus kurang dari 2GB.

  • Menggunakan opsi -XX: + AggressiveHeap . Ketika saya mencoba pendekatan ini, saya mendapatkan pesan kesalahan 'Memori tidak cukup' yang menginformasikan bahwa ukuran tumpukan adalah 1273,4 MB, meskipun komputer saya memiliki memori 8 GB.

Apakah ada pendekatan lain yang dapat saya coba untuk meningkatkan ukuran heap maksimum JVM? Berikut ringkasan spesifikasi komputernya:

  • OS: Windows 7 (64 bit)
  • Prosesor: Intel Core i7 (2,66 GHz)
  • Memori: 8 GB
  • java -version:
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) Client VM (build 16.0-b13, mixed mode, sharing)
Alceu Costa
sumber
7
BTW: Ukuran memori minimum dan maksimum sekarang menjadi opsi standar. Anda dapat menggunakan -ms dan -mx sebagai ganti -Xms dan -Xmx. -X ?? dicadangkan untuk opsi non-standar.
Peter Lawrey
2
Standar JVM yang mana? Mereka masih non-standar untuk HotSpot JVM (mulai 1.8). Lihat docs.oracle.com/javase/8/docs/technotes/tools/unix/…
Huckle
-mx dan -ms ada dan berfungsi, tetapi saya tidak dapat menemukannya di dokumentasi resmi java @PeterLawrey> dapatkah Anda menambahkan tautan ke dokumentasi? Terima kasih
Michal Bernhard
2
@MichalBernhard itu kompatibilitas mundur dengan Java 1.1. Saya melihatnya didokumentasikan untuk versi itu tetapi mungkin sulit ditemukan sekarang. ;)
Peter Lawrey
1
Terima kasih @PeterLawrey untuk penjelasannya. Tetapi ketika Anda mengatakan itu sekarang standar, maksudnya itu standar dari Java 1.1 (tetapi bukan dokumen di versi yang lebih baru)? Sepertinya aneh :) btw saya menemukan tautan di dokumentasi Java 1.1 dan Anda benar: ad.ntust.edu.tw/course/ad5601701/jmdl/docs/java/tooldocs/win32/…
Michal Bernhard

Jawaban:

48

Dapatkan sendiri JVM 64-bit dari Oracle .

Presiden James K. Polk
sumber
1
Berhasil untuk saya :-) Menjalankan aplikasi menggunakan -Xmx4g dan sejauh ini tidak ada masalah.
Alceu Costa
96

Saat Anda menggunakan JVM dalam mode 32-bit, ukuran heap maksimum yang dapat dialokasikan adalah 1280 MB. Jadi, jika Anda ingin lebih dari itu, Anda perlu menjalankan JVM dalam mode 64.

Anda dapat menggunakan berikut ini:

$ java -d64 -Xms512m -Xmx4g HelloWorld

dimana,

  • -d64: Akan mengaktifkan 64-bit JVM
  • -Xms512m: Akan menyetel ukuran heap awal sebagai 512 MB
  • -Xmx4g: Akan menyetel ukuran heap maksimum sebagai 4 GB

Anda dapat menyetel -Xms dan -Xmx sesuai kebutuhan Anda (YMMV)

Sumber daya yang sangat bagus tentang penyetelan kinerja JVM, yang mungkin ingin Anda lihat: http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html

mohitsoni
sumber
JVM saya adalah 32-bit dan memungkinkan maksimum -Xmx1024M. Juga akan mencoba versi 64bit.
kiltek
Saya telah mencoba JVM 64-bit dan bekerja dengan sempurna. Sekarang saya dapat menyetel ukuran heap maksimum 4096 MB. Jika Anda telah menginstal 32 dan 64 bit, setidaknya di Windows Anda perlu mengarahkan jalur Java untuk aplikasi Anda ke versi 64 bit yang baru diinstal. Jika tidak, kesalahan akan terus berlanjut. Pada Windows, hal ini sering kali dapat dilakukan dengan mengubah jalur Java pada Variabel Lingkungan sistem.
Fabiano
Saya kira batas untuk tumpukan maksimum bukanlah 1280, tetapi mendekati 1700MB. Saya menggunakan tumpukan maksimum 1600MB pada instalasi JVM 32 bit saya dan itu berfungsi dengan baik.
Fabiano
apa argumen HelloWorld dalam perintah Anda? bagaimana saya bisa menggunakan perintah ini jika saya ingin mengatur maksimum proses Java yang dimulai dengan perintah java -jar myApp.jar di linux?
LordScone
Hai, bolehkah saya bertanya berapa ukuran maksimum tumpukan java yang dapat saya tetapkan? Ketika saya menjalankan aplikasi, defaul -Xmx di mesin saya adalah 4GB, tetapi dapatkah saya mengaturnya lebih dari 4GB?
Ock
14

Saya yakin batas 2GB adalah untuk Java 32-bit. Saya pikir v1.6 selalu 64 bit, tetapi coba paksa mode 64 bit hanya untuk melihat: tambahkan opsi -d64.

G__
sumber
Opsi -D64 tidak berfungsi, saya akan mencoba menggunakan JVM 64-bit seperti yang disarankan GregS dan melaporkan hasilnya.
Alceu Costa
1
Sakelar -d64 dan -d32 hanya berfungsi dengan benar di Solaris (setidaknya menurut dokumentasi ini): java.sun.com/docs/hotspot/HotSpotFAQ.html#64bit_layering .
Lukasz Stelmach
Saya sudah mencoba dengan kedua opsi tersebut. Dengan -d64 JVM gagal diluncurkan meskipun saya tidak menentukan opsi Xmx. -D64 hanya berfungsi jika saya tidak menentukan Xmx.
Alceu Costa
@Lukasz -d64 dan -d32 juga tampaknya berfungsi pada JVM Apple. Tetapi dokumen itu tampaknya menyiratkan bahwa mereka tidak berfungsi untuk Windows & Linux JVM Sun.
G__
8

Java 32-bit dibatasi hingga sekitar 1,4 hingga 1,6 GB.

FAQ tumpukan Oracle 32 bit

Kutipan

Batas heap teoretis maksimum 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.

Jean B
sumber
4

Konfigurasi di bawah berfungsi untuk saya:

JAVA_HOME=/JDK1.7.51-64/jdk1.7.0_51/
PATH=/JDK1.7.51-64/jdk1.7.0_51/bin:$PATH
export PATH
export JAVA_HOME

JVM_ARGS="-d64 -Xms1024m -Xmx15360m -server"

/JDK1.7.51-64/jdk1.7.0_51/bin/java $JVM_ARGS -jar `dirname $0`/ApacheJMeter.jar "$@"
tutorialbyexample
sumber