Bonjour !
Je suis entrain de devenir fou avec le garbage collector de java et l'impossibilité de faire un free à la main...
Depuis que j'ai intégré le mode client / serveur dans mon projet, la mémoire augmente inexorablement au cours de l'exécution. Le problème vient à priori des requètes qu'il ne libère pas après les avoir envoyé et lu.
Le code d'envoi de requete du serveur :
Code :
- public void envoyerRequeteSituation() throws Exception {
- CRequeteSituation requeteSituation = new CRequeteSituation(
- OPartieServeur.getInstance().getCarte().toString(),
- OPartieServeur.getInstance().getListePacmansEnvoyable(),
- OPartieServeur.getInstance().getListeFantomesEnvoyable()
- );
- m_outputStream.writeObject(requeteSituation);
- m_outputStream.flush();
- }
|
Le constructeur utilisé :
Code :
- public CRequeteSituation(String matriceBlocs,
- List<CPersonnageEnvoyable> listePacmans,List<CPersonnageEnvoyable> listeFantomes) {
- m_matriceBlocs = matriceBlocs;
- m_listePacmans = listePacmans;
- m_listeFantomes = listeFantomes;
- }
|
En gros, les méthodes toString et getListe créent respectivement un new String ou new LinkedList, les remplissent puis les return.
Si j'ai bien compris le principe du garbage collector, ces string et liste n'étant (à priori) référencés que par la requete (et par une variable locale dans les toString et getListe, mais qui logiquement sont détruites à la fin de la fonction), à la fin de envoyerRequete, il devrait libérer requeteSituation et tout ce qu'elle contient.
Or ce n'est pas le cas, les données stagnent quelque part, où et pourquoi je ne sais pas... J'ai tenté de mettre un requeteSituation = null à la fin de la fonction, aucun résultat (logique...), j'ai tenté de ne faire qu'une fois le new CRequeteSituation() en mettant cette requete en donnée membre du serveur et en utilisant dans envoyerRequete() une fonction integrer() avec exactement le mm code que le constructeur, mais ça ne marche plus (pb avec la serialization et les références je suppose).
Bref quelqu'un aurait une solution pour libérer des choses à la main, ou verrait immédiatement l'erreur dans mon sale code de noob ? Merci d'avance...