Augmentation de la taille maximale du tas JVM pour les applications gourmandes en mémoire

88

J'ai besoin d'exécuter une application gourmande en mémoire Java qui utilise plus de 2 Go, mais j'ai des problèmes pour augmenter la taille maximale du tas. Jusqu'à présent, j'ai essayé les approches suivantes:

  • Réglage du paramètre -Xmx, par exemple -Xmx3000m. Cette approche échoue lors de la création de la JVM. D'après ce que j'ai recherché sur Google, il semble que -Xmx doit être inférieur à 2 Go.

  • Utilisation de l' option -XX: + AggressiveHeap . Lorsque j'essaie cette approche, j'obtiens une erreur «Mémoire insuffisante» qui indique que la taille du tas est de 1273,4 Mo, même si mon ordinateur dispose de 8 Go de mémoire.

Existe-t-il une autre approche que je peux essayer d'augmenter la taille maximale du tas de la JVM? Voici un résumé des spécifications de l'ordinateur:

  • Système d'exploitation: Windows 7 (64 bits)
  • Processeur: Intel Core i7 (2,66 GHz)
  • Mémoire: 8 Go
  • 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
la source
7
BTW: La taille de mémoire minimale et maximale sont désormais des options standard. Vous pouvez utiliser -ms et -mx au lieu de -Xms et -Xmx. -X?? est réservé aux options non standard.
Peter Lawrey
2
Standard pour quelle JVM? Ils ne sont toujours pas standard pour la JVM HotSpot (à partir de 1.8). Voir docs.oracle.com/javase/8/docs/technotes/tools/unix/…
Huckle
-mx et -ms existent et fonctionnent, mais je ne les trouve pas dans la documentation officielle Java @PeterLawrey> pouvez-vous ajouter un lien vers la documentation? Merci
Michal Bernhard
2
@MichalBernhard c'est la rétrocompatibilité avec Java 1.1. Je l'ai vu documenté pour cette version mais pourrait être difficile à trouver maintenant. ;)
Peter Lawrey
1
Merci @PeterLawrey pour une explication. Mais quand vous dites que c'est maintenant standard, vous voulez dire qu'il est standard de Java 1.1 (mais pas de document dans les versions ultérieures)? Cela semble étrange :) btw j'ai trouvé le lien sur la documentation Java 1.1 et vous avez raison: ad.ntust.edu.tw/course/ad5601701/jmdl/docs/java/tooldocs/win32/…
Michal Bernhard

Réponses:

47

Procurez-vous une JVM 64 bits d' Oracle .

Président James K. Polk
la source
1
A travaillé pour moi :-) Exécution de l'application en utilisant -Xmx4g et aucun problème jusqu'à présent.
Alceu Costa
96

Lorsque vous utilisez JVM en mode 32 bits, la taille maximale du segment de mémoire pouvant être allouée est de 1280 Mo. Donc, si vous voulez aller au-delà de cela, vous devez appeler JVM en mode 64.

Vous pouvez utiliser les éléments suivants:

$ java -d64 -Xms512m -Xmx4g HelloWorld

où,

  • -d64: activera la JVM 64 bits
  • -Xms512m: définira la taille initiale du tas comme 512 Mo
  • -Xmx4g: définira la taille maximale du tas à 4 Go

Vous pouvez régler -Xms et -Xmx selon vos besoins (YMMV)

Une très bonne ressource sur le réglage des performances JVM, qui pourrait vouloir se pencher sur: http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html

mohitsoni
la source
Ma JVM est 32 bits et autorise un maximum de -Xmx1024M. Je vais également essayer la version 64 bits.
kiltek
J'ai essayé JVM 64 bits et cela a parfaitement fonctionné. Je peux maintenant définir 4096 Mo de taille maximale de tas. Lorsque vous avez à la fois 32 et 64 bits installés, au moins sous Windows, vous devez pointer le chemin Java de vos applications vers la nouvelle version 64 bits installée. Sinon, l'erreur persistera. Sous Windows, cela peut souvent être fait en modifiant le chemin Java sur les variables d'environnement du système.
Fabiano le
Je suppose que la limite du tas maximum n'est pas de 1280, mais quelque chose de près de 1700 Mo. J'ai utilisé 1600 Mo de tas maximum sur mon installation JVM 32 bits et cela a bien fonctionné.
Fabiano
quel est l'argument HelloWorld dans votre commande? comment puis-je utiliser cette commande si je souhaite définir le maximum d'un processus Java démarré avec la commande java -jar myApp.jar sous linux?
LordScone
Bonjour, puis-je vous demander quelle est la taille maximale du tas Java puis-je définir? Lorsque j'exécute l'application, la valeur par défaut -Xmx sur ma machine est de 4 Go, mais puis-je la définir à plus de 4 Go?
Ock
14

Je crois que la limite de 2 Go est pour Java 32 bits. Je pensais que la v1.6 était toujours 64 bits, mais essayez de forcer le mode 64 bits juste pour voir: ajoutez l'option -d64.

G__
la source
L'option -D64 n'a pas fonctionné, je vais essayer d'utiliser la JVM 64 bits comme GregS l'a suggéré et rapporter les résultats.
Alceu Costa
1
Les commutateurs -d64 et -d32 fonctionnent correctement uniquement sous Solaris (du moins selon cette documentation): java.sun.com/docs/hotspot/HotSpotFAQ.html#64bit_layering .
Lukasz Stelmach
J'ai essayé avec les deux options. Avec -d64, la JVM ne parvient pas à se lancer même si je ne spécifie pas l'option Xmx. Le -D64 ne fonctionne que lorsque je ne spécifie pas le Xmx.
Alceu Costa
@Lukasz -d64 et -d32 semblent également fonctionner sur la JVM d'Apple. Mais ce document semble impliquer qu'ils ne sont pas fonctionnels pour les JVM Windows et Linux de Sun.
G__
8

Java 32 bits est limité à environ 1,4 à 1,6 Go.

FAQ sur le tas Oracle 32 bits

Citation

La limite de tas théorique maximale pour la JVM 32 bits est 4G. En raison de diverses contraintes supplémentaires telles que la permutation disponible, l'utilisation de l'espace d'adressage du noyau, la fragmentation de la mémoire et la surcharge de la machine virtuelle, en pratique, la limite peut être beaucoup plus faible. Sur la plupart des systèmes Windows 32 bits modernes, la taille maximale du tas varie de 1,4G à 1,6G. Sur les noyaux Solaris 32 bits, l'espace d'adressage est limité à 2G. Sur les systèmes d'exploitation 64 bits exécutant la machine virtuelle 32 bits, la taille maximale du tas peut être plus élevée, approchant la 4G sur de nombreux systèmes Solaris.

Jean B
la source
4

La configuration ci-dessous fonctionne pour moi:

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 "$@"
tutorielpar exemple
la source