cs_biboobib
Messages postés95Date d'inscriptiondimanche 29 juillet 2007StatutMembreDernière intervention27 août 2011
-
20 août 2011 à 12:55
cs_GodConan
Messages postés2113Date d'inscriptionsamedi 8 novembre 2003StatutContributeurDerniè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..
cs_biboobib
Messages postés95Date d'inscriptiondimanche 29 juillet 2007StatutMembreDernière intervention27 août 20111 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.
coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 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.
cs_GodConan
Messages postés2113Date d'inscriptionsamedi 8 novembre 2003StatutContributeurDernière intervention 6 octobre 201212 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)
Vous n’avez pas trouvé la réponse que vous recherchez ?
coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 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.
cs_GodConan
Messages postés2113Date d'inscriptionsamedi 8 novembre 2003StatutContributeurDernière intervention 6 octobre 201212 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)
cs_Julien39
Messages postés6414Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention29 juillet 2020369 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.
cs_biboobib
Messages postés95Date d'inscriptiondimanche 29 juillet 2007StatutMembreDernière intervention27 août 20111 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.
cs_GodConan
Messages postés2113Date d'inscriptionsamedi 8 novembre 2003StatutContributeurDernière intervention 6 octobre 201212 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)
cs_laurent1024
Messages postés987Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention30 août 201225 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
shaiulud
Messages postés404Date d'inscriptionmardi 18 décembre 2001StatutMembreDernière intervention15 juillet 201422 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