Java.lang.OutOfMemoryError: Java heap space
Résolu
Ezekhx
Messages postés
73
Date d'inscription
Statut
Membre
Dernière intervention
-
Ezekhx Messages postés 73 Date d'inscription Statut Membre Dernière intervention -
Ezekhx Messages postés 73 Date d'inscription Statut Membre Dernière intervention -
Bonjour !
Je cherche à développer un serveur privé d'un MMORPG en ligne qui a fermé il y a une décennie, et j'ai récupéré les fichiers du jeu.
Maintenant, après avoir suivi toutes les étapes de fabrication, la console m'indique ceci après avoir lancé le RunAll.exe.
Comment faire ? Aidez-moi s'il vous plaît je n'ai plus aucune idée !
J'ai essayé en faisant Panneau de configuration > Programmes > Java et en augmentant le "head space" jusqu'à avoir 3GB en utilisant la commande "-Xms3072m".
Merci d'avance pour vos réponses.

Je cherche à développer un serveur privé d'un MMORPG en ligne qui a fermé il y a une décennie, et j'ai récupéré les fichiers du jeu.
Maintenant, après avoir suivi toutes les étapes de fabrication, la console m'indique ceci après avoir lancé le RunAll.exe.
Comment faire ? Aidez-moi s'il vous plaît je n'ai plus aucune idée !
J'ai essayé en faisant Panneau de configuration > Programmes > Java et en augmentant le "head space" jusqu'à avoir 3GB en utilisant la commande "-Xms3072m".
Merci d'avance pour vos réponses.

9 réponses
Bonjour,
Ouvre jvisualvm.exe (fourni dans le JDK) puis lances ton programme comme d'habitude, tu vas voir apparaître dans Visual VM le process de ton application, ouvre le, cela va te donner davantage d'informations sur la vie de ton programme (mémoire, threads actifs, garbage collector, etc.)
Ouvre jvisualvm.exe (fourni dans le JDK) puis lances ton programme comme d'habitude, tu vas voir apparaître dans Visual VM le process de ton application, ouvre le, cela va te donner davantage d'informations sur la vie de ton programme (mémoire, threads actifs, garbage collector, etc.)
Voilà ce que ça me donne ! 
Qu'est ce que ça veux dire selon toi ?

Qu'est ce que ça veux dire selon toi ?
Dans ta description tu parles d'un RunAll.exe
Un programme Java ne devrait pas être en .exe et le fait qu'il le soit signifie que ton programme n'est pas complètement un programme Java, donc tout ce qu'il devrait être possible de faire normalement ne l'est peut-être pas dans ton cas.
Il faudrait en savoir plus sur ton programme pour savoir ce qui relève du Java et ce qui ne l'est pas et donc non modifiable...
Un programme Java ne devrait pas être en .exe et le fait qu'il le soit signifie que ton programme n'est pas complètement un programme Java, donc tout ce qu'il devrait être possible de faire normalement ne l'est peut-être pas dans ton cas.
Il faudrait en savoir plus sur ton programme pour savoir ce qui relève du Java et ce qui ne l'est pas et donc non modifiable...
Vu qu'il plante quand il doit charger les "Mobs", je pense que le problème vient de l'un ou de ces dossiers : 

Un programme qui plante parce qu'il n'a plus de mémoire pourrait planter à n'importe quel moment même sur l'opération la plus insignifiante, ce sera la goutte d'eau qui fait déborder le vase.
Le but du jeu ici ça va être de lui trouver un vase plus grand...
Si tu as accès aux fichiers .class c'est bon signe pour toi, on pourrait lancer le programme Java sans passer par le RunAll.exe... est-ce qu'il y a d'autres fichiers au niveau du RunAll qui permettrait de savoir comment est démarré le programme (des .bat ou .cmd par exemple)
Le but du jeu ici ça va être de lui trouver un vase plus grand...
Si tu as accès aux fichiers .class c'est bon signe pour toi, on pourrait lancer le programme Java sans passer par le RunAll.exe... est-ce qu'il y a d'autres fichiers au niveau du RunAll qui permettrait de savoir comment est démarré le programme (des .bat ou .cmd par exemple)
Voilà le dossier où se situe le runall 



et voilà, quand je fais le chemin jusqu'aux dossier où s'exécutent les .exe, j'atterris ici.
Que voudrais-tu voir ?
Et merci pour la métaphore, je comprends mieux maintenant ^^




et voilà, quand je fais le chemin jusqu'aux dossier où s'exécutent les .exe, j'atterris ici.
Que voudrais-tu voir ?
Et merci pour la métaphore, je comprends mieux maintenant ^^
Le premier fichier RunAll.bat est intéressant.
Déjà tu vas diminuer la valeur
Ensuite tu vas rajouter sur la même ligne
Et tu vas lancer le programme directement en lançant le .bat (sans le .exe)
Je t'invites aussi à ouvrir jvisualvm comme tout à l'heure pour suivre l'évolution de la mémoire, ici je donnes des valeurs un peu au pif, qu'il faudra sûrement ajuster.
Déjà tu vas diminuer la valeur
4000mà
512mparce que ça n'a aucun sens.
Ensuite tu vas rajouter sur la même ligne
-Xms512m -Xmx2048m
Et tu vas lancer le programme directement en lançant le .bat (sans le .exe)
Je t'invites aussi à ouvrir jvisualvm comme tout à l'heure pour suivre l'évolution de la mémoire, ici je donnes des valeurs un peu au pif, qu'il faudra sûrement ajuster.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
J'ai fait ça et quand je l'exécute, il se ferme tout de suite...
Ensuite j'ai retiré du coup le -Xms512m -Xmx2048m, et ça me refait comme au début.
Est-ce que j'ai fait une erreur ?
Et j'ai pas compris l'histoire du .bat, tu veux dire que je lance juste le hoertje ?
Je ne sais pas ce que c'est hoertje...
Les deux options que je t'ai demandé de rajouter, mets les avant le nom de la classe GameServer.StartGameServer
Et pour éviter que ça s'ouvre et que ça se ferme, démarre ton .bat depuis une invite de commande.
Sachant que si c'est bien fait, peut-être qu'avec le .exe ça marcherait quand même...
Les deux options que je t'ai demandé de rajouter, mets les avant le nom de la classe GameServer.StartGameServer
Et pour éviter que ça s'ouvre et que ça se ferme, démarre ton .bat depuis une invite de commande.
Sachant que si c'est bien fait, peut-être qu'avec le .exe ça marcherait quand même...
"Comment est-ce que je le démarre avec un .bat ?"
Vu ton impression écran tu ne vois pas les extensions de tes fichiers, j'ai donc l'impression que tu n'as jamais eu de .exe, ce que tu appelles RunAll.exe c'est en fait le RunAll.bat que tu édites avec NotePad++
Bref, cliques dessus comme avant, sinon lances le depuis une invite de commandes.
PS. N'oublies pas d'enregistrer le fichier dans NotePad++ (sur ton impression écran ce n'est pas le cas...)
Vu ton impression écran tu ne vois pas les extensions de tes fichiers, j'ai donc l'impression que tu n'as jamais eu de .exe, ce que tu appelles RunAll.exe c'est en fait le RunAll.bat que tu édites avec NotePad++
Bref, cliques dessus comme avant, sinon lances le depuis une invite de commandes.
PS. N'oublies pas d'enregistrer le fichier dans NotePad++ (sur ton impression écran ce n'est pas le cas...)

Voilà ce qu'il se passe sur Visual avec le programme où j'ai changé 4000m par 512m !
4000m par 512m ne changera rien, c'est un paramétrage de la mémoire "secondaire" (permgen), toi ton problème concerne la mémoire principale (heap) qu'il faut augmenter d'où mon paramétrage
Sur ton image il est toujours à 256m...
-Xms512m -Xmx2048mqui devrait faire commencer le graphe en haut à droite à 512 minimum, et 2048 maximum.
Sur ton image il est toujours à 256m...
"on peut pas faire entrer le -Xms512m -Xmx2048m ailleurs"
Si tu parles de bidouiller les config de la JVM comme tu l'as fait avec ton -Xms3072m ça ne sert à rien, d'ailleurs ce serait bien que tu la vires cette configuration et que tu reviennes à la conf par défaut de la JVM parce que si elle prends déjà 3Go rien que pour démarrer, ça fait 3Go de moins disponibles pour ton programme...
Les options Xms et Xmx devraient être pris en compte immédiatement ou alors c'est que tu ne modifies pas le bon fichier, pour ça rien de plus simple : tu changes le nom de la classe à lancer, genre GameStartServer2, apriori il devrait te dire qu'il ne trouve pas la classe...
Si tu parles de bidouiller les config de la JVM comme tu l'as fait avec ton -Xms3072m ça ne sert à rien, d'ailleurs ce serait bien que tu la vires cette configuration et que tu reviennes à la conf par défaut de la JVM parce que si elle prends déjà 3Go rien que pour démarrer, ça fait 3Go de moins disponibles pour ton programme...
Les options Xms et Xmx devraient être pris en compte immédiatement ou alors c'est que tu ne modifies pas le bon fichier, pour ça rien de plus simple : tu changes le nom de la classe à lancer, genre GameStartServer2, apriori il devrait te dire qu'il ne trouve pas la classe...
Quand je lance le RunAll.bat, voilà sur quoi je tombe au début, jusqu'au fameux message d'erreur. Est-ce que la première ligne te paraît suspecte ? 

La première ligne est normale, l'architecture de la JVM a changé en Java 8 et il n'y a plus de permgen (la mémoire secondaire) mais ça ne va pas te changer grand chose ton problème est sur la mémoire principale.
Par contre du coup tu peux complètement virer l'option à 4000m, elle ne sert à rien si tu es en Java 8... la question étant de savoir si ce n'est pas un peu risqué de vouloir faire tourner un programme qui a 10 ans avec Java 8 pour lequel il n'est peut être pas compatible.
Mais ça, ce sera d'autres erreurs plus tard...
Par contre du coup tu peux complètement virer l'option à 4000m, elle ne sert à rien si tu es en Java 8... la question étant de savoir si ce n'est pas un peu risqué de vouloir faire tourner un programme qui a 10 ans avec Java 8 pour lequel il n'est peut être pas compatible.
Mais ça, ce sera d'autres erreurs plus tard...
KX, j'ai un autre problème pour toi a présent, si tu es toujours disponible, toujours lié à ce fameux jeu. A présent que le "serveur" est lancé, le client lui refuse de se connecter au serveur (il refuse de le lancer, ou ne trouve pas le serveur), comment faire ? Je peux fournir des screens de la console du serveur et du message d'erreur si tu veux.
Qu'est-ce que cela veux dire ?
Qu'est-ce que cela veux dire ?
J'ai ouvert ton .exe, que fais-je ensuite ?
Ce n'est pas magique et au moindre problème comme ici tu vas être coincé.
"j'ai plein d'infos mais je ne sais pas quoi en faire"
Déjà savoir si la quantité de mémoire allouée à ton programme est bien celle que tu as configurée... au travers des arguments de la JVM et/ou suivre les graphes d'évolution de mémoire pour savoir à combien ça plante.