Donner plus de mémoire à mon fichier jar
J'ai un multithread robot. Dans ce programme, si je charge un lot de graines, j'obtiens une erreur. J'ai vu le java.lang.OutOfMemoryError
et de la pensée, peut-être que la mémoire n'est pas assez. J'ai essayé de lancer le crawler.jar
fichier avec ces arguments: java -Xms512m -Xmx3G -jar crawler.jar
mais jusqu'à présent, pas de chance.
C'est la StackTrace du programme:
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:597)
at com.sleepycat.je.utilint.DaemonThread.runOrPause(DaemonThread.java:99)
at com.sleepycat.je.dbi.EnvironmentImpl.runOrPauseDaemons(EnvironmentImpl.java:772)
at com.sleepycat.je.dbi.EnvironmentImpl.envConfigUpdate(EnvironmentImpl.java:717)
at com.sleepycat.je.dbi.EnvironmentImpl.finishInit(EnvironmentImpl.java:579)
at com.sleepycat.je.dbi.DbEnvPool.getEnvironment(DbEnvPool.java:204)
at com.sleepycat.je.Environment.makeEnvironmentImpl(Environment.java:230)
at com.sleepycat.je.Environment.<init>(Environment.java:212)
at com.sleepycat.je.Environment.<init>(Environment.java:166)
...
Est-ce lié à la mémoire comme je m'en doutais? L'ajout de la -Xms512m -Xmx3G
travail lorsque j'exécute le fichier jar à l'aide de java -jar
?
J'ai couru le gestionnaire des tâches (je suis en cours d'exécution sur Windows Server), mais après l'exécution de l'application, la mémoire n'a pas été beaucoup plus élevé! Suis-je tort?
- va this aider ?
- Le nombre de threads est votre programme de la création? Inclure un peu de code pour mieux aider.
- Mon code est très complexe. Je voudrais poster si c'était possible. Je l'ai corrigé. Je vous remercie.
Vous devez vous connecter pour publier un commentaire.
La -Xms512m -Xmx3G option uniquement l'effet de la taille du tas de la JVM et ne permettrait pas de résoudre votre problème.
Cependant, le défaut le nombre de thread limites devrait être suffisant dans la plupart des scénarios. Vous pouvez augmenter la limite en améliorant la JVM/options du Système, mais pas n'importe comment beaucoup de fil à créer, à la capacité de votre système est bornée à votre ordinateur de ressources. par exemple, cpu, mémoire, réseau, etc.
Je suggère de résoudre ce problème à partir d'un point de vue différent:
Ces types d'erreurs peuvent souvent être résolus par de simples profilage. Le JDK fourni avec jvisualvm.
E. g.
C:\Program Files\Java\jdk1.7.0_11\bin\jvisualvm.exe
Vous serez en mesure de voir un graphique de votre taille de segment de mémoire et il est également utile de vérifier la PermGen space.
Si cela ne marche pas révéler quoi que ce soit, essayez d'ajouter-XX:-HeapDumpOnOutOfMemoryError lorsque vous exécutez votre bocal et puis de charger le heap dump dans l'Éclipse de la Mémoire de l'Analyseur.
Vous êtes le frai plus de threads que Java peut prendre. Essayer de réduire la taille de la pile avec ce paramètre de JVM:
-Xss128k
Si cela n'est-il pas, peut-être, vous sont frapper sur les OS de la limite. Si vous utilisez Linux, ajouter une ligne de ce genre pour
~/.profile
:ulimit -u 4096
Il y a de nombreuses raisons pourquoi cela pourrait se produire en fonction de votre code et le système d'exploitation que vous utilisez.