web-dev-qa-db-fra.com

Puis-je définir la taille de segment Java max pour l'exécution à partir d'un fichier jar?

Je lance un fichier jar Java qui nécessite souvent plus que la taille de segment maximale de 64 Mo par défaut. Une taille de tas de 256 Mo est cependant suffisante pour cette application. Est-il possible de spécifier (dans le manifeste peut-être?) De toujours utiliser une taille de tas maximale de 256 Mo lors du lancement du fichier jar? (Plus de détails ci-dessous, si nécessaire.)


Ceci est une application en ligne de commande que j'ai écrite en Java, qui effectue certaines manipulations d'image. Sur les images haute résolution (environ 12 mégapixels et plus, ce qui n'est pas rare), j'obtiens une erreur OutOfMemoryError.

Actuellement, je lance l'application à partir d'un fichier jar, c'est-à-dire.

Java -jar MyApp.jar params...

Je peux éviter une erreur OutOfMemoryError en spécifiant une taille maximale de segment de mémoire de 256 Mo sur la ligne de commande, à savoir:

Java -Xmx256m -jar MyApp.jar params...

Cependant, je ne veux pas avoir à le préciser, car je sais que 256 Mo est suffisant, même pour des images haute résolution. J'aimerais que cette information soit sauvegardée dans le fichier jar. Est-ce possible?

35
Kip

vous pouvez aussi utiliser un wrapper comme launch4j qui rendra un exécutable pour la plupart des OS: es et vous permettra de spécifier les options VM.

13

Écrivez un script batch ou shell contenant la ligne suivante. Placez-le dans le dossier où MyApp.jar est stocké.

Java -Xmx256M -jar MyApp.jar

Après cela, ouvrez toujours ce fichier batch/script afin de lancer le fichier JAR. Bien que, cela n’intègrera pas la spécification de la taille de la mémoire virtuelle dans le fichier jar lui-même. Mais, il peut remplacer le problème pour écrire la même commande souvent en ligne de commande.

23
kravi

J'avais un besoin similaire et je pensais pouvoir le préciser dans le manifeste suggéré ci-dessus. Cependant, ce n'est pas possible. Ma solution est similaire à celle suggérée par Alex ci-dessus. Cependant, ma démarche consistait à faire en sorte que la méthode principale utilise ProcessBuilder de Java pour démarrer un autre processus Java. Lorsque vous démarrez un autre processus, vous pouvez spécifier la mémoire maximale pour le nouveau processus. Vous avez essentiellement un processus Java en démarrer un autre. C'est un peu hokey, mais ça fonctionne et cela vous permet toujours de lancer votre application en double-cliquant sur le fichier Jar, ce que je sais que vous voulez faire. Regardez dans le ProcessBuilder.

4
Andrew

Trouvé une réponse sur google.

Il dit non pour le fichier JAR, oui dans JavaWeb Start, et que vous devez le faire dans votre script/votre programme de lancement/wrapper (éventuellement spécifique au système).

3
instanceof me

Ce n'est pas génial, mais vous pourriez l'avoir comme un fichier JAR exécutable, puis dans son fichier principal, le faire exécuter lui-même via la ligne de commande en tant que thread non démon avec les paramètres appropriés stockés dans un fichier de propriétés, calculé , puis quittez l'original. Vous pourriez même le faire exécuter le jar avec un autre "vrai" point d’entrée qui attend ces paramètres.

3
Alex Beardsley

OUI! Vous avez besoin d’écrire un petit programme de démarrage - j’ai écrit un petit programme pour le faire, principalement compatible avec plusieurs plates-formes (les chemins devraient aller) - voir ci-dessous. Cela a été testé sur Windows/Ubuntu/Mac OS X.

Article du blog sur le développement silencieux sur l'augmentation du nombre de jars java exécutables

2
Ben

Apparemment, cela fonctionne sur Ubuntu

> export _Java_OPTIONS="-Xmx1g"

Java -jar jconsole.jar & Ramassé des _Java_OPTIONS: -Xmx1g

1
Syd Gillani

Il y a plusieurs façons de le faire:

Vous pouvez avoir un autre fichier Jar qui déclenche votre Jar principal.

Ou, ayez un fichier de commandes qui démarrera votre pot. Mais attention, s'il est téléchargé depuis say net, l'utilisateur devra définir les autorisations pour que le script soit exécutable.

Construire un installateur. Sur Mac, à l’aide du bundler Oracle Java App pour Java 7, le bundler Apple App pour Java 6 génère le fichier .app. Vous ne pouvez toujours pas le redistribuer car les autorisations nécessaires ne seront pas définies. Construisez un fichier dmg pour le fichier d'application. Ceci peut être utilisé pour la distribution. Un programme d'installation similaire pour Windows

La troisième technique serait la meilleure, car vous pouvez alors bien conditionner les dépendances, définir tous les arguments de la machine virtuelle Java, etc.

0
Jatin