Mon Programme consomme trop de RAM [Résolu]

Signaler
Messages postés
95
Date d'inscription
dimanche 29 juillet 2007
Statut
Membre
Dernière intervention
27 août 2011
-
Messages postés
2113
Date d'inscription
samedi 8 novembre 2003
Statut
Contributeur
Dernière intervention
6 octobre 2012
-
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

Messages postés
95
Date d'inscription
dimanche 29 juillet 2007
Statut
Membre
Dernière intervention
27 août 2011
1
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
Messages postés
2113
Date d'inscription
samedi 8 novembre 2003
Statut
Contributeur
Dernière intervention
6 octobre 2012
11
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)
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
41
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.
Messages postés
2113
Date d'inscription
samedi 8 novembre 2003
Statut
Contributeur
Dernière intervention
6 octobre 2012
11
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)
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
41
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.
Messages postés
2113
Date d'inscription
samedi 8 novembre 2003
Statut
Contributeur
Dernière intervention
6 octobre 2012
11
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)
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
345
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.
Messages postés
95
Date d'inscription
dimanche 29 juillet 2007
Statut
Membre
Dernière intervention
27 août 2011
1
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?
Messages postés
2113
Date d'inscription
samedi 8 novembre 2003
Statut
Contributeur
Dernière intervention
6 octobre 2012
11
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)
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
24
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".
Messages postés
404
Date d'inscription
mardi 18 décembre 2001
Statut
Membre
Dernière intervention
15 juillet 2014
20
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
Messages postés
2113
Date d'inscription
samedi 8 novembre 2003
Statut
Contributeur
Dernière intervention
6 octobre 2012
11
cela s appel un singleton... mais la vrai solution est ailleur ;o)

GodConan ;o)