2017-07-30 3 views
2

personnes. C'est une erreur très courante, mais peu importe ce que je fais, je n'arrive pas à trouver un moyen de contourner le problème. J'utilise IDEA IntelliJ, et depuis longtemps, j'essaie d'implémenter un système d'étiquetage de rôle sémantique (SRL) qui fonctionne, et j'ai finalement décidé d'utiliser le modèle PathLSTM (https://github.com/microth/PathLSTM) pour faire de même.Java - Erreur d'espace de tas étrange continue d'être levé

Le problème est, cet algorithme dépend de fichiers de modèles qui sont aussi grands que 2.7g, car il est des opérations de l'analyse (https://drive.google.com/uc?id=0B5aLxfs6OvZBYUk2b0hLZjNqY3c&export=download)

Cela me jette un espace de tas insuffisant -. Erreur de dépassement de mémoire


Loading pipeline from 
C:\Users\Vyso\Downloads\NLP\SRL\SEMAFOR\absSemafor\LTH\wttv\PathLSTM-pre- 
illinois-built\srl-ACL2016-eng.model 
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
at java.lang.reflect.Array.newInstance(Array.java:75) 
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1883) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1529) 
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1919) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1529) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2231) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2155) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2013) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2231) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2155) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2013) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2231) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2155) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2013) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2231) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2155) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2013) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535) 
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1919) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1529) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2231) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2155) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2013) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2231) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2155) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2013) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:422) 

Process finished with exit code 1 

Alors, naturellement, j'ai changé l'espace de tas de fois la machine virtuelle Java sur mon système, et mon IDE, où je pouvais changer les vmoptions, comme suit. (C'était -Xms128m et -Xmx512m, par défaut).


# custom IntelliJ IDEA VM options 

-Xms2048m 
-Xmx4000m 
-XX:ReservedCodeCacheSize=240m 
-XX:+UseConcMarkSweepGC 
-XX:SoftRefLRUPolicyMSPerMB=50 
-ea 
-Dsun.io.useCanonCaches=false 
-Djava.net.preferIPv4Stack=true 
-XX:+HeapDumpOnOutOfMemoryError 
-XX:-OmitStackTraceInFastThrow 

Mais même après l'attribution d'environ 4G comme espace Max Heap, je reçois l'erreur. Chose amusante, dans la barre d'outils de gestion de la mémoire de mon EDI, je peux voir que le code utilise un maximum de 500m pendant l'exécution, donc je ne sais vraiment pas comment cette erreur d'espace est toujours levée. Peut-être que c'est juste une erreur de niveau débutant de mon côté, mais j'ai essayé de sortir de ce problème pendant quelques jours maintenant, et j'apprécierais vraiment si quelqu'un pouvait me donner des instructions sur la façon dont je pourrait se débarrasser de cette erreur.

Merci.

+0

tas IDE La taille n'affecte pas la taille de segment de votre application, vous devez la spécifier dans le champ Options de configuration de la machine Exécuter/Déboguer à la place. – CrazyCoder

+0

@CrazyCoder, Yep. Je l'ai essayé. Ça me redonne la même erreur, mon pote. Combien d'estime-t-on que je devrais faire? – user8389863

Répondre

1

Il y a deux instances JVM différentes en jeu ici:

  • La machine virtuelle Java qui exécute IDEA
  • La machine virtuelle Java qui exécute PathLSTM

Je soupçonne que la question est ici avec la machine virtuelle Java qui exécute PathLSTM. Pour accorder ces valeurs non par défaut pour -Xms, -Xmx, vous devez aller à Run > Edit Configurations ..., puis choisir la configuration d'exécution pour vos appels PathLSTM, puis ajouter -XmsNNNm -XmxYYYm à l'entrée VM options.

Vous pouvez utiliser JVisualVM (vous le trouverez dans le répertoire bin de votre JDK) pour connaître la quantité de mémoire utilisée lors de l'exécution de PathLSTM. Lancez IDEA puis lancez JVisualVM et vous verrez quelque chose (probablement nommé "Idea") sous le noeud Local dans l'arborescence des Applications puis démarrerez PathLSTM et vous verrez une autre entrée apparaître sous le noeud Local, cliquez dessus et ensuite choisissez l'onglet Moniteur. Par défaut, le graphique en haut à droite affiché ici indique l'utilisation de la mémoire de l'application sélectionnée. Vous verrez probablement le tas utilisé croître jusqu'à ce que ce processus obtienne un MOO, puis changez le -Xmx en Run > Edit Configurations ... et réessayez jusqu'à ce que vous trouviez la valeur requise. Ou bien, choisissez une très grande valeur, puis laissez JVisualVM vous montrer la valeur maximale réelle utilisée, puis modifiez votre -Xmx pour correspondre à ce maximum.

Les points clés sont:

  • Toute modification apportée à la configuration de la taille du tas doit être fait à l'instance JVM qui est en fait en cours d'exécution PathLSTM, vous configurez que JVM par Run > Edit Configurations ...
  • Vous pouvez utiliser jVisualVM pour surveiller le fonctionnement de que machine virtuelle Java
  • pour> 2 Go de tas, vous aurez besoin d'être en cours d'exécution d'une machine virtuelle Java 64 bits
+0

Merci, @glitch. Je le vois maintenant. :) Euh, la plupart des gens exécutent cet algorithme directement à partir de la ligne de commande, en spécifiant -java -Xmx40g -cp ... Cela signifie-t-il qu'ils ont 40 Go de RAM ou plus, qu'ils utilisent comme espace de tas? Aurai-je besoin de cela aussi, pour exécuter mon application? Thnx pour votre temps. – user8389863

+0

Exécuter avec java -Xmx40g certainement _implies_ qu'ils s'attendent à pouvoir traiter 40 Go de RAM, s'ils ont besoin de beaucoup de mémoire est une autre affaire :) Je suggère d'exécuter votre processus et d'exécuter JVisualVM simultanément pour voir combien de mémoire il utilise que vous pouvez calculer la quantité de mémoire dont il a réellement besoin **, puis configurer sa JVM en conséquence. – glytching

+0

Merci !!! Cela me rendait fou – Coop