Mon Programme consomme trop de RAM [Résolu]

cs_biboobib 95 Messages postés dimanche 29 juillet 2007Date d'inscription 27 août 2011 Dernière intervention - 20 août 2011 à 12:55 - Dernière réponse : cs_GodConan 2116 Messages postés samedi 8 novembre 2003Date d'inscriptionContributeurStatut 6 octobre 2012 Dernière intervention
- 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
cs_biboobib 95 Messages postés dimanche 29 juillet 2007Date d'inscription 27 août 2011 Dernière intervention - 27 août 2011 à 15:18
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

Merci cs_biboobib 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 74 internautes ce mois-ci

Commenter la réponse de cs_biboobib
cs_GodConan 2116 Messages postés samedi 8 novembre 2003Date d'inscriptionContributeurStatut 6 octobre 2012 Dernière intervention - 20 août 2011 à 13:19
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
coucou747 12336 Messages postés mardi 10 février 2004Date d'inscription 30 juillet 2012 Dernière intervention - 20 août 2011 à 13:26
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
cs_GodConan 2116 Messages postés samedi 8 novembre 2003Date d'inscriptionContributeurStatut 6 octobre 2012 Dernière intervention - 20 août 2011 à 16:06
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
coucou747 12336 Messages postés mardi 10 février 2004Date d'inscription 30 juillet 2012 Dernière intervention - 20 août 2011 à 16:13
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
cs_GodConan 2116 Messages postés samedi 8 novembre 2003Date d'inscriptionContributeurStatut 6 octobre 2012 Dernière intervention - 20 août 2011 à 17:44
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
cs_Julien39 6450 Messages postés mardi 8 mars 2005Date d'inscription 17 mai 2018 Dernière intervention - 20 août 2011 à 23:09
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
cs_biboobib 95 Messages postés dimanche 29 juillet 2007Date d'inscription 27 août 2011 Dernière intervention - 21 août 2011 à 23:56
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
cs_GodConan 2116 Messages postés samedi 8 novembre 2003Date d'inscriptionContributeurStatut 6 octobre 2012 Dernière intervention - 22 août 2011 à 06:38
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
cs_laurent1024 987 Messages postés mardi 31 mai 2005Date d'inscription 30 août 2012 Dernière intervention - 22 août 2011 à 11:06
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
shaiulud 405 Messages postés mardi 18 décembre 2001Date d'inscription 15 juillet 2014 Dernière intervention - 25 août 2011 à 19:09
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
cs_GodConan 2116 Messages postés samedi 8 novembre 2003Date d'inscriptionContributeurStatut 6 octobre 2012 Dernière intervention - 28 août 2011 à 05:02
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.