Mon Programme consomme trop de RAM

Résolu
cs_biboobib Messages postés 95 Date d'inscription dimanche 29 juillet 2007 Statut Membre Dernière intervention 27 août 2011 - 20 août 2011 à 12:55
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 - 28 août 2011 à 05:02
Salut tous le monde,

J'ai un problem avec mon programme car la RAM augumente avec chaque button click et chaque nouvelle frame(SWING); et quant la RAM atteint 90MB l'application se block.
Surement la probléme ca vient du nombre d'instance dans le code..

svp quelq'un a une solution pour ça?
merci

12 réponses

cs_biboobib Messages postés 95 Date d'inscription dimanche 29 juillet 2007 Statut Membre Dernière intervention 27 août 2011 1
27 août 2011 à 15:18
Merci les mecs pour vos réponses, j' ai trouver une solution pour mon problème ,
la solution est d'utiliser la meme instance crée d'avance a chaque fois que tu l'appelle, alors pas besoin de crée un autre instance du coup diminution de la mémoire RAM utiliser.
voila le code:

public MaClasse {
private static MaClasse attribut;

public static Maclass getInstance(){
if(attribut = = null){
attribut = new MaClasse()
}
return attribut;
}

public static void main (String[] args) {

// au lieu de crée new MaClasse , j'appelle l'instance je j'ai crée avant.

MaClass var = Maclasse.getInstance();
}
}

Maintenant ca Marche :)
Merci
3
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 12
20 août 2011 à 13:19
salut,

ben vi! verifie ton code... c est meme fort de faire un memory leak en java!! ;o)
si tu ne trouves pas, montre le ... ;o)


GodConan ;o)
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
20 août 2011 à 13:26
Bonjour,

Sans voir ton code, il est difficile de t'aider.

Dans n'importe quel langage turing complet, on peut faire des memory leak, c'est super simple, il suffit de concerver des informations dont on a plus besoin (dans un cache par exemple)

Récemment, j'ai eu un problème d'algo qui nécéssitait soit plusieurs milliers d'années de calcul, soit une quantité de ram que je n'avais pas (j'avais juste 4go sur ma machine)
J'ai loué un dédié avec 24 go, et ça n'a toujours pas suffit.
J'ai mis des weak pointers sur certains objets, et des finalizers dans les classes pointées pour libérer les objets d'un cache automatiquement, et ça ne me suffit toujours pas.

Bref, certains algos nécéssitent juste beaucoup de ram.

Comme je le disais, si t'as un cache, l'utilisation des weaks peut-etre d'une grande aide pour garbage collecter ton cache.
0
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 12
20 août 2011 à 16:06
on peu toujours jouer avec les besoins de ram ;o) ... certe au détriment des performences... ;o) ou alors faut attendre que la techno évolue pour refaire ton algo ;o) .... hihi ;o) j ai refai pour m amuser quelque code qui ne tournaient pas il y a 15 ans ;o) et maintenant ;o) pfff ca prend moins d une minute ;o) hihi

GodConan ;o)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
20 août 2011 à 16:13
ouais enfin pour mon problème précis, je pense qu'on doit pouvoir prouver qu'il faut soit une quantité exponentielle de ram, soit un temps exponentiel... Donc à part si on trouve une découverte mathématique qui pourrait m'aider, j'arriverais peut-être à résoudre ça quand j'ai peu de paramètres, mais pour plus de variables c'est foutu... Enfin c'est un machin inspiré de SAT donc bon...

Mais là, le problème doit-etre plus simple j'imagine, il doit juste leaker sur un cache ou un truc comme ça.

De toute façon sans avoir plus de détails sur son projet, on ne peut pas l'aider.
0
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 12
20 août 2011 à 17:44
yup ... ;o) mais en java ;o) y a pas de cache caché!!! ;o) et la GC travail bien ;o) c est l avantage sur le C++ ;o) c est pour cela que les fuite de memoire sont rare ;o) (perso ca ne m ai jamais arrivé) ;o) il doit y avoir une collection incrementer en permanence ;o) et en static ;o) !!! mais bon sans le code il est vrai que l on ne peu pas faire grd chose ;o)


GodConan ;o)
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 369
20 août 2011 à 23:09
Bonjour,

Si tu as utilisé la récursivité, ca peut faire augmenter la taille de la ram nécéssaire assez rapidement.

Après, ca me parait étrange d'avoir un nombre fou de frames dans une application. Tu as peut être un soucis lors de la conception du programme.

Sinon, tu peux regarder ca : http://www.javafr.com/codes/TUTORIEL-CODE-JAVA-PLUS-RAPIDE_52488.aspx il a des choses discutables mais tu pourras puiser quelques idées qui te permettront d'améliorer les choses. Le principe est de ne pas créer trop d'objets dans ton code, utilises donc les StringBuilder, initialise la taille de tes listes et essaye de réutiliser les objets existants.
0
cs_biboobib Messages postés 95 Date d'inscription dimanche 29 juillet 2007 Statut Membre Dernière intervention 27 août 2011 1
21 août 2011 à 23:56
Salut,

merci pour les réponses,

j ai presque 10 classes avec Fenêtre (Frame) et chaque bouton dans mon application ouvre le Fenêtre désirer;
avec chaque click la RAM augmente mais quand je ferme la Fenêtre La RAM s'abaisse pas.. et avec un autre click s'augmente plus, mais si je travaille sur un même fenêtre il ya pas de problème.

Comment instancier une fenêtre comme: Fenetre f=new Fenetre(); et réutiliser la même instance plusieurs fois sans crée une autre, je crois c est la solution.

que pensez vous?
0
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 12
22 août 2011 à 06:38
Dans une ihm generalement les frames sont en nombre fini ;o) ... et n ont donc pas besoin d etre instancié plus d une fois ... tu as surement un probleme de conception à ce niveau. cependant tu peux aussi faire un dispose() et mettre ta référence à null le gc devrait faire le reste ... ;o)

GodConan ;o)
0
cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
22 août 2011 à 11:06
Bonjour.
Tu peux aussi regarder du coté de la méthode
[http://download.oracle.com/javase/1.4.2/docs/api/javax/swing[i /JFrame.html#setDefaultCloseOperation%28int%29]setDefautCloseOperation]
Sets the operation that will happen by default when the user initiates a "close" on this frame. You must specify one of the following choices:

DO_NOTHING_ON_CLOSE (defined in WindowConstants): Don't do anything; require the program to handle the operation in the windowClosing method of a registered WindowListener object.
HIDE_ON_CLOSE (defined in WindowConstants): Automatically hide the frame after invoking any registered WindowListener objects.
DISPOSE_ON_CLOSE (defined in WindowConstants): Automatically hide and dispose the frame after invoking any registered WindowListener objects.
EXIT_ON_CLOSE (defined in JFrame): Exit the application using the System exit method. Use this only in applications.
[u]
The value is set to HIDE_ON_CLOSE by default. /u/i

Il faudrait mettre la valeur "DISPOSE_ON_CLOSE".
0
shaiulud Messages postés 404 Date d'inscription mardi 18 décembre 2001 Statut Membre Dernière intervention 15 juillet 2014 22
25 août 2011 à 19:09
Tu peux voir le contenu de ta JVM pour ton application avec cet outil.
http://www.eclipse.org/mat
Tu verras en un coup d’œil les objets les plus gourmand.

Tu peux aussi mettre les paramètres suivants en modifiant les paramètres RAM pour les mettre en adéquation avec ceux de ta machine.


config pour 1Go générant un dump en cas de OutOfMemoryException
-Xss128k
-Xmn384m
-Xms1024m
-Xmx1024m
-XX:PermSize=128m
-XX:MaxPermSize=256m
-XX:ReservedCodeCacheSize=128m
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
-XX:ParallelGCThreads=16
-XX:+CMSPermGenSweepingEnabled
-XX:+CMSClassUnloadingEnabled
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/tmp/heap_dump.hprof
0
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 12
28 août 2011 à 05:02
cela s appel un singleton... mais la vrai solution est ailleur ;o)

GodConan ;o)
0