2012-04-04 6 views
3

J'ai un petit programme qui devrait effectuer un transfert bancaire parallèle en utilisant le STM, donc je le teste sur différentes machines, 2-core et 1-core. Dans les machines à 2 cœurs tout fonctionne, mais dans la machine à 1 cœurs, l'erreur Java Out of Memory est levée lorsque j'effectue 1 million de transactions parallèles.Clojure STM Mémoire insuffisante

L'erreur est la suivante "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space

J'ai aussi une version Java-Synchronize du même programme qui fonctionne, même si elle est plus lente, il peut atteindre un million de transactions.

Que puis-je faire pour que mon application Clojure fonctionne dans la machine à 1 cœur? J'ai peur que le garbage collector ne puisse pas gérer autant de Refs ... qu'en penses-tu?

Merci beaucoup pour votre aide!

Mise à jour: Il fonctionne maintenant, je l'ai fait java -Xmx1000m -jar myprog.jar et a parfaitement fonctionné! Je ne savais pas qu'il était possible d'augmenter la taille du tas pour la JVM, et c'était exactement mon problème. Merci beaucoup à « sw1nn » pour le grand commentaire;)

+4

Avez-vous essayé d'augmenter la taille du tas pour la JVM avec les options -Xmx? Pour JDK 32 bits, vous êtes limité à environ 1500M, mais vous pouvez aller beaucoup plus loin avec 64 bits. Si vous augmentez la limite et que le programme échoue (mais plus tard), vous avez probablement une fuite de mémoire. Mais il est possible que vous ayez juste besoin d'un peu plus de tas sur la machine 1-core. – sw1nn

+0

Oh super! Comment puis-je faire cela, à partir de la ligne de commande? Avez-vous un lien? Merci beaucoup! – nuvio

+2

java -Xmx1500m -cp clojure-1.3.0.jar clojure.main -i myclojure.clj – sw1nn

Répondre

2

Vous pouvez également ajouter jvm à votre adjoigne project.clj de Leiningen comme ci-dessous:

:jvm-opts ["-Xmx1500m"] 

pour l'obtenir spécifié lorsque vous exécutez votre programme à leiningen (comme les tests)