Mon Programme consomme trop de RAM [Résolu]

Messages postés
95
Date d'inscription
dimanche 29 juillet 2007
Dernière intervention
27 août 2011
- - Dernière réponse : cs_GodConan
Messages postés
2116
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
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
Messages postés
95
Date d'inscription
dimanche 29 juillet 2007
Dernière intervention
27 août 2011
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Commenter la réponse de cs_biboobib
Messages postés
2116
Date d'inscription
samedi 8 novembre 2003
Statut
Contributeur
Dernière intervention
6 octobre 2012
0
Merci
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)
Commenter la réponse de cs_GodConan
Messages postés
12336
Date d'inscription
mardi 10 février 2004
Dernière intervention
30 juillet 2012
0
Merci
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.
Commenter la réponse de coucou747
Messages postés
2116
Date d'inscription
samedi 8 novembre 2003
Statut
Contributeur
Dernière intervention
6 octobre 2012
0
Merci
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)
Commenter la réponse de cs_GodConan
Messages postés
12336
Date d'inscription
mardi 10 février 2004
Dernière intervention
30 juillet 2012
0
Merci
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.
Commenter la réponse de coucou747
Messages postés
2116
Date d'inscription
samedi 8 novembre 2003
Statut
Contributeur
Dernière intervention
6 octobre 2012
0
Merci
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)
Commenter la réponse de cs_GodConan
Messages postés
6450
Date d'inscription
mardi 8 mars 2005
Dernière intervention
17 mai 2018
0
Merci
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.
Commenter la réponse de cs_Julien39
Messages postés
95
Date d'inscription
dimanche 29 juillet 2007
Dernière intervention
27 août 2011
0
Merci
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?
Commenter la réponse de cs_biboobib
Messages postés
2116
Date d'inscription
samedi 8 novembre 2003
Statut
Contributeur
Dernière intervention
6 octobre 2012
0
Merci
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)
Commenter la réponse de cs_GodConan
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Dernière intervention
30 août 2012
0
Merci
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".
Commenter la réponse de cs_laurent1024
Messages postés
405
Date d'inscription
mardi 18 décembre 2001
Dernière intervention
15 juillet 2014
0
Merci
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
Commenter la réponse de shaiulud
Messages postés
2116
Date d'inscription
samedi 8 novembre 2003
Statut
Contributeur
Dernière intervention
6 octobre 2012
0
Merci
cela s appel un singleton... mais la vrai solution est ailleur ;o)

GodConan ;o)
Commenter la réponse de cs_GodConan

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.