Question

J'ai un serveur de ligne de commande basé sur Java en cours d'exécution qui héberge les meilleurs scores pour un jeu que j'ai créé sur mon site Web.Cela fonctionne efficacement et rapidement.Cependant, cela prend environ 200 Mo de RAM!J'ai tout essayé, de l'annulation manuelle de tout à l'appel de System.gc ()

Je commence à soupçonner que cela pourrait avoir quelque chose à voir avec le flux d'entrée et les objets de flux de sortie que j'utilise à partir de la connexion Socket.J'ai remarqué que lorsque je lance le programme pour la première fois, il occupe une quantité normale de RAM.Ensuite, une fois qu'il obtient une connexion, il passe à 100 Mo et continue de monter pour chaque connexion.

EDIT: Dans l'une de mes classes, je tiens tous les noms, scores et horodatage dans 3 ArrayLists différents.Cependant, un examen approfondi utilisant jhat et jmap a montré que combinés, ils n'utilisent qu'environ 5 Mo de RAM.

Si cela est trop vague pour que quelqu'un puisse répondre, demandez et je vous donnerai volontiers le code source.

Était-ce utile?

La solution

Vous pouvez avoir une fuite causée par la conservation des références à des objets au-delà de leur durée de vie utile.

Je vous suggère de vous procurer un profileur et de l'utiliser pour enquêter. Un bon point de départ gratuit est le programme VisualVM qui distribue avec Java 6.

Un profileur est un programme distinct qui s'attache à la JVM ou héberge une JVM pour votre programme et surveille l'exécution de votre programme. Il peut suivre les allocations d'objets et l'exécution du code, soit statistiquement, soit en "instrumentant" le code en cours d'exécution. Il vous montrera si les objets sont alloués et non libérés, et peut montrer quels objets ils sont et où ils ont été alloués (parmi beaucoup d'autres choses utiles).

J'utilise jProfiler, qui est commercial (mais qui en vaut la peine pour un professionnel). La dernière fois que j'ai cherché, il y avait plusieurs profileurs de bonne qualité disponibles gratuitement (au moins pour un usage personnel). VisualVM a des capacités de profilage basiques, mais utiles, et je commencerais par là (sous Windows, vous pouvez le trouver dans le répertoire bin JDK; je suppose que c'est la même chose pour Linux et Mac).

Autres conseils

Essayez d'utiliser quelque chose comme jmap suivi de jhat pour voir comment votre mémoire est réellement utilisée.

La JVM de Sun (Oracle) ne libère jamais de mémoire vers le système d'exploitation, il n'est donc pas surprenant que vous constatiez une augmentation monotone de l'utilisation de la mémoire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top