web-dev-qa-db-fra.com

Y a-t-il un nombre maximum auquel vous pouvez définir Xmx lorsque vous essayez d'augmenter la mémoire jvm?

Y a-t-il un max. taille que vous pouvez définir Xmx? Je l'ai mis à 1024m et Eclipse s'ouvre bien. Lorsque je le place au-dessus de 1024, Eclipse ne s'ouvre pas et j'obtiens l'erreur "jvm terminé. Code de sortie = -1" ...

Je faisais cela parce que je reçois toujours un "Java.lang.OutOfMemoryError: Java heap space". Je lis dans un fichier .txt de 35,5 Mo et cette erreur se produit lorsqu'il ne fait que lire dans le fichier utilisant la boucle "while((line = reader.readLine()) != null)". J'aurais pensé que 1024 Mo auraient suffi. Quelqu'un peut-il m'aider?

44
guess who

Oui, il y a un maximum, mais cela dépend du système. Essayez-le et voyez, doublant jusqu'à ce que vous atteigniez une limite, puis cherchez vers le bas. Au moins avec Sun JRE 1.6 sur linux, vous obtenez des messages d'erreur intéressants sinon toujours informatifs (peregrino est un netbook exécutant ubuntu 32 bits avec 2G RAM et pas d'échange):

peregrino:$ Java -Xmx4096M -cp bin WheelPrimes 
Invalid maximum heap size: -Xmx4096M
The specified size exceeds the maximum representable size.
Could not create the Java virtual machine.

peregrino:$ Java -Xmx4095M -cp bin WheelPrimes 
Error occurred during initialization of VM
Incompatible minimum and maximum heap sizes specified

peregrino:$ Java -Xmx4092M -cp bin WheelPrimes 
Error occurred during initialization of VM
The size of the object heap + VM data exceeds the maximum representable size

peregrino:$ Java -Xmx4000M -cp bin WheelPrimes 
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

(experiment reducing from 4000M until)

peregrino:$ Java -Xmx2686M -cp bin WheelPrimes 
(normal execution)

La plupart sont explicites, sauf -Xmx4095M qui est plutôt étrange (peut-être une comparaison signée/non signée?), Et qu'il prétend réserver 2686M sur une machine de 2 Go sans échange. Mais cela laisse entendre que la taille maximale est de 4G et non de 2G pour une machine virtuelle 32 bits, si le système d'exploitation vous permet de résoudre ce problème.

33
Pete Kirkham

Je pense qu'une JVM 32 bits a un maximum de 2 Go de mémoire, ce qui est peut-être obsolète. Si j'ai bien compris, vous avez défini le -Xmx sur le lanceur Eclipse. Si vous souhaitez augmenter la mémoire du programme que vous exécutez à partir d'Eclipse, vous devez définir -Xmx dans le "Run-> Exécuter les configurations ..." (sélectionnez votre classe et ouvrez l'onglet Arguments, placez-la dans le VM arguments) et NON au démarrage d'Eclipse

Modifier: les détails que vous avez demandés. dans Eclipse 3.4

  1. Exécuter-> Exécuter les configurations ...

  2. si votre classe ne figure pas dans la liste de gauche dans la sous-arborescence "Application Java", cliquez sur "Nouvelle configuration de lancement" dans le coin supérieur gauche

  3. à droite, onglet "Principal" assurez-vous que le projet et la classe sont les bons

  4. sélectionnez l'onglet "Arguments" à droite. celui-ci a deux zones de texte. l'un est pour les arguments du programme qui entrent dans le tableau args [] fourni avec votre méthode principale. l'autre est pour les arguments VM. mis dans celui avec les arguments VM (inférieur iirc) ce qui suit:
    - Xmx2048m

    Je pense que 1024m devraient être plus que suffisants pour ce dont vous avez besoin!

  5. Cliquez sur Appliquer, puis sur Exécuter

  6. Devrait marcher :)

5
user54579

Je pense que c'est environ 2 Go. Alors que la réponse de Pete Kirkham est très intéressante et contient probablement la vérité, j'ai alloué plus de 3 Go sans erreur, mais il n'a pas utilisé 3 Go dans la pratique. Cela pourrait expliquer pourquoi vous avez pu allouer 2,5 Go sur 2 Go RAM sans espace de swap. En pratique, il n'utilisait pas 2,5 Go.

1
Stephen Price

Jetez un œil à this pour quelques erreurs courantes dans la définition du tas Java. Vous avez probablement défini la taille du tas sur une valeur supérieure à la mémoire physique de votre ordinateur.

Vous devez éviter de résoudre ce problème en augmentant la taille du segment de mémoire. Au lieu de cela, vous devez profiler votre application pour voir où vous dépensez une telle quantité de mémoire.

1
kgiannakakis