2010-09-09 28 views
3

Nous avons une application Swing qui traite des quantités relativement importantes de données. Par exemple, nous traitons actuellement des fichiers CSV avec des millions de lignes de données. Pour des raisons de performance et de simplicité, nous gardons simplement toutes les données en mémoire. Cependant, différents utilisateurs auront différentes quantités de données à traiter ainsi que différentes quantités de RAM. Lors de la création du programme d'installation, nous devons bien entendu spécifier la taille du tas. Existe-t-il un moyen simple de permettre à l'utilisateur de spécifier le tas sans qu'il soit nécessaire de modifier manuellement un fichier de configuration ou un fichier .bat? Je suppose que tous les utilisateurs ne seraient pas à l'aise avec cela.Comment autoriser l'utilisateur à choisir facilement la quantité de mémoire à allouer dans une application Java Swing?

J'ai vu un exemple où une application a spécifié trois raccourcis différents chacun avec une quantité différente de mémoire spécifiée. Cela pourrait fonctionner mais j'aimerais une option plus flexible. L'utilisateur pourrait alors choisir celui qui fonctionnerait le mieux pour lui.

Répondre

6

Je recommande d'avoir quelque chose de similaire à IntelliJ. Il affiche une boîte de dialogue de configuration lorsqu'une exception OutOfMemoryException se produit. Cette boîte de dialogue permet à l'utilisateur de configurer la taille du tas et le stocke à idea.exe.vmoptions. Vous devez sous-traiter le contenu du fichier dans la commande de lancement java/javaw ou avoir un programme d'amorçage Java et lancer le vrai.

Une variante vraiment cool sur ceci est de suggérer une taille de mémoire basée sur la taille des données. L'utilisateur n'a aucun moyen de connaître la quantité de mémoire dont votre programme a besoin. Par conséquent, les conseils que vous pouvez fournir lors de la sélection de la valeur les aideront énormément.

Il est extrêmement important à l'appui de cette solution que vous attendiez et gériez OutOfMemoryExceptions d'une manière qui évite la corruption de données!

0

Vous n'avez pas mentionné comment vous créez le programme d'installation. Si vous ne l'utilisez pas déjà, je suggère d'utiliser NSIS. La documentation est bonne et il y a un plugin pour eclipse. Vous pouvez utiliser l'assistant pour générer le fichier nsi, puis le modifier manuellement pour les options qui ne sont pas disponibles avec l'assistant. En ce qui concerne vos besoins actuels, ajoutez simplement une page au programme d'installation pour les options et, selon l'option sélectionnée, copiez le bon fichier de propriétés du système dans le dossier des paramètres utilisateur que vous pouvez utiliser pour démarrer votre programme. Je ne sais pas si c'est possible mais je pense qu'une fois le programme installé, l'utilisateur peut relancer l'installateur et sélectionner une autre option.

+0

Nous utilisons NSIS. Le problème avec cette solution est que la taille du tas est fixée au moment de l'installation. L'utilisateur devrait être en mesure de modifier la taille du tas plus tard quand ils ajoutent plus de mémoire à leur ordinateur ou doivent travailler sur un fichier plus grand que celui qu'ils ont déjà travaillé auparavant. –

+0

Il suffit de demander à l'utilisateur de réexécuter le programme d'installation et de choisir une option différente s'il a besoin d'une taille de segment supérieure. Si vous voulez le rendre plus facile pour l'utilisateur, essayez de créer un petit programme qui affiche une fenêtre de dialogue pour laisser la sélection de la taille du tas et lancer votre programme principal comme un processus différent. Il y a une discussion à ce sujet à http://stackoverflow.com/questions/480433/launch-jvm-process-from-a-java-application-use-runtime-exec –

1

J'écrirais un fichier startup.jar court avec très peu de paramètres de mémoire fixe à partir d'un script. À son tour, startup.jar lancera votre application cible avec Runtime.exec() et les paramètres ajustés. Vous aboutissez à 2 instances JVM qui dépensent plus de mémoire qu'une seule machine virtuelle Java (JVM). Mais si votre application dépense beaucoup de mémoire, la première JVM n'a pas d'importance.

1

L'idée principale serait:

  • Lancez votre application principale via un script shell semblable à ceci:
 
@echo off 
setlocal 
REM This reads the JVM command line options from a user configuration file 
for /f %x in (%HOMEDRIVE%%HOMEPATH%\myapp.config) do set JVM_OPTIONS=%x 
REM Important: call javaw and not java 
javaw -jar myApp.jar %JVM_OPTIONS% 
endlocal 
  • Dans votre application Swing, une option de menu Paramètres de mémoire .... Lorsque l'utilisateur sélectionne cela, analyser le fichier de configuration de l'utilisateur et remplir une boîte de dialogue de paramètres afin que l'utilisateur puisse changer tout ce qui est approprié.Lorsque l'utilisateur clique sur Appliquer ou Ok,, remplacer le fichier de configuration utilisateur par les options de ligne de commande en fonction des paramètres sélectionnés par l'utilisateur (dans votre cas, -Xmx) et afficher un message indiquant Redémarrez l'application pour appliquer ces paramètres.
+0

J'aime l'idée d'avoir un menu en application swing . Lorsque vous définissez la configuration de la mémoire, nous pouvons recharger le classloader défini par l'utilisateur, où nous avons chargé l'application. –

+1

Le rechargement du classloader ne suffit pas, je pense que vous devez quitter et redémarrer la JVM pour que les modifications prennent effet. – gpeche

1

catch the excpetion OutOfMemory, Lauch une boîte de dialogue utilisateur swing pour définir la limite de mémoire, transmettre cette valeur à un fil qui utilise Runtime.exec() redémarrer l'application en utilisant java les vmoptions pot de -CP lib qui va lancer une nouvelle JvM avec la taille de la mémoire spécifiée user.sample:

Runtime.getRuntime().exec("java -cp 
-Xms2560m -Xmx2560m -XX:NewSize=32M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseParNewG launch.jar");