Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1222 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  out of mem

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

out of mem

n°1574226
vashkiry
Posté le 13-06-2007 à 10:45:19  profilanswer
 

bonjour,
 
j'ai une classe ImageManager qui gere différents types d'image ( Image, BufferedImage , ImageIcon etc etc )  
je passe d'un type à l'autre dans chaque fonction qui travail sur ces images ( redimensionnement , rotation , recherche ...)  
ces images sont envoyé ensuite sur du MIDP (peut importe...)
 
le probleme que j'ai avec cette classe est le suivant : j'ai un out of memorie sur le serveur ou est cette classe apres l'envoi de plusieurs centaines d'images, ces putin d'images sont allouées et le ramasse miette ne fonctionne pas ce qui blinde la ram du serveur en 2-2...
 
avez vous une solution ???
 
merci
 
 
guigui

mood
Publicité
Posté le 13-06-2007 à 10:45:19  profilanswer
 

n°1574232
flo850
moi je
Posté le 13-06-2007 à 10:48:58  profilanswer
 

verifie que tes objets ne sont plus referencés du tout , a la limite, force l'appel du rammasse miette ( system.gc il me semble )  

n°1574234
vashkiry
Posté le 13-06-2007 à 10:56:11  profilanswer
 

Cet appel ne garantit pas que tous les objets inutiles seront supprimés de la mémoire, je cherche quelque chose de vraiment bourrin, un commando d'elite, un truc qui efface tout

n°1574257
brisssou
8-/
Posté le 13-06-2007 à 11:31:14  profilanswer
 

rm -rf *


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
n°1574275
vashkiry
Posté le 13-06-2007 à 11:40:53  profilanswer
 

comment ca s'utilise???

n°1574279
vashkiry
Posté le 13-06-2007 à 11:44:05  profilanswer
 

le rm pointe sur un repertoire???
je peut lancer cette commande a partir de mon code java??
un rm ca semble quand même extrem na???

n°1574281
vashkiry
Posté le 13-06-2007 à 11:46:57  profilanswer
 

ah ouai c sympa comme commande.... desolé de pas avoir capté la blague plus tot....

n°1574295
vashkiry
Posté le 13-06-2007 à 11:59:17  profilanswer
 

rien pour un ramasse miette JAVA performant??

n°1574298
flo850
moi je
Posté le 13-06-2007 à 12:02:20  profilanswer
 

ben le garbage collector

 

tu veux quoi de plus ? qu'il vire les objets encore utilisés ?

 

le garbage collector vire tous les objets qui ne sont plus referencé

 

apres, il faut peut etre te poser des questions sur ton code


Message édité par flo850 le 13-06-2007 à 12:05:06
n°1574300
schnapsman​n
Zaford Beeblefect
Posté le 13-06-2007 à 12:05:24  profilanswer
 

flo850 a écrit :

verifie que tes objets ne sont plus referencés du tout


+++++
 
envisage l'usage de weak references
vérifie la quantité de mémoire autorisée pour ta JVM
 
Le problème ne viens PAS du GC selon 99% de vraissemblance, toute recherche en ce sens est vaine.
 

mood
Publicité
Posté le 13-06-2007 à 12:05:24  profilanswer
 

n°1574301
vashkiry
Posté le 13-06-2007 à 12:06:00  profilanswer
 

mon system.gc marche parfois  
j'ai des system.gc un peu partout  
j'affiche la memoire utilisé a chaque iteration et elle ne cesse d'augmenter jusqu'a saturation du serveur...

n°1574304
vashkiry
Posté le 13-06-2007 à 12:08:00  profilanswer
 

j'ai pensé a un truk de ce genre la :
java -Xms128m -Xmx256m  
 
mais ca ne change rien ca met simplement plus de temps à se remplir

n°1574307
flo850
moi je
Posté le 13-06-2007 à 12:09:50  profilanswer
 

c'est donc bien ton code qui continent des fuites de mémoire  

n°1574309
schnapsman​n
Zaford Beeblefect
Posté le 13-06-2007 à 12:10:54  profilanswer
 

vashkiry a écrit :

mon system.gc marche parfois  
j'ai des system.gc un peu partout  


ça sert à rien ça.
vérifie que tu ne reférence pas trop d'objets. Si tu ne peux pas faire autrement, apprends la notion de WeakReference
http://java.sun.com/j2se/1.4.2/doc [...] rence.html

n°1574361
vashkiry
Posté le 13-06-2007 à 13:38:38  profilanswer
 

Code :
  1. public byte[] getCurrentImage(Viewer v)
  2. {
  3. System.gc ();
  4. Runtime runtime = Runtime.getRuntime();
  5. System.out.println ("Memoir : "+runtime.freeMemory() );
  6. System.out.print( "used : " + ( runtime.totalMemory()-runtime.freeMemory() ) );
  7. System.out.print( "  committed : " + runtime.totalMemory() );
  8. System.out.println( "  max : " + runtime.maxMemory() );
  9. int nbDifferences=0;
  10. String Fichier_image = "";
  11. Image img2=null;
  12. BufferedImage image=null;
  13. ImageIcon img3=null;
  14. Image imgToLoad=null;
  15. ImageIcon firstPic;
  16. File imag=null;
  17. Image lastImg = v.getLastImage();
  18. int x=0;
  19. double scaledFactor=0;
  20. if(v.getClPrefs().isOrientationC())
  21. {
  22.  x = 1;
  23. }
  24. else
  25. {
  26.  x = 2;
  27. }
  28. lastImg = null;
  29. if(lastImg != null)
  30. {
  31.  imag = new File (Util.getImgFileName(v.getClIdent().getNumClient(),v.getClIdent().getNumCam()));
  32.  if(imag.exists())
  33.  {
  34.   Fichier_image=recherche(imag);
  35.   ImageIcon ic = new ImageIcon(Fichier_image);
  36.   imgToLoad = ic.getImage();
  37.   ic = null;
  38.   int[] image1 = testImg(imgToLoad);
  39.   int[] image2 = testImg(lastImg);
  40.   if(image1.length==image2.length)
  41.   {
  42.    for(int i=0;i<image1.length;i++)
  43.    {
  44.     if(Math.abs(image1[i]-image2[i])>=200000)
  45.     {
  46.      nbDifferences++;
  47.     }
  48.    }
  49.    if(imgToLoad != null)
  50.    {
  51.     v.setLastImage(imgToLoad);
  52.    }
  53.   }
  54.   else
  55.   {
  56.   }
  57.  }
  58. }
  59. else
  60. {
  61.  firstPic = null;
  62.  Fichier_image=recherche(new File (Util.getImgFileName(v.getClIdent().getNumClient(),v.getClIdent().getNumCam())));
  63.  File imageI = new File(Fichier_image);
  64.  System.out.println("Taille image sur Disque : " + imageI.length());
  65.  if(imageI.isFile())
  66.  {
  67.   try
  68.   {
  69.    try
  70.    {
  71.     firstPic = new ImageIcon(Fichier_image);
  72.    }
  73.    catch(Exception e)
  74.    {
  75.     e.printStackTrace();
  76.    }
  77.    scaledFactor = getScaledFactor(firstPic.getIconWidth(), firstPic.getIconHeight(), v.getClPrefs().getWidth(), v.getClPrefs().getLength());
  78.    v.setLastImage(firstPic.getImage());
  79.   }
  80.   catch(Exception e)
  81.   {
  82.    System.out.println("Erreur de génération du jpeg 2" );
  83.   }
  84.  }
  85.  imageI = null;
  86. }
  87. //if((nbDifferences >= 20000) || (lastImg == null))
  88. if((nbDifferences >= 0) || (lastImg == null))
  89. {
  90.  image = loadCurrentImageFromFile(Fichier_image);
  91.  if(image != null)
  92.  {
  93.   //redimensionnement et rotation  
  94.   if (x==1)
  95.   {
  96.    img2= rotate(-1.57, image);
  97.    if(img2!= null)
  98.    {
  99.     img2 = getScaledImage(img2,scaledFactor);
  100.    }
  101.   }
  102.   //redimensionnement sans rotation  
  103.   else if(x==2)
  104.   {
  105.    img2= image;
  106.    if(img2!= null)
  107.    {
  108.     img2 = getScaledImage(img2,scaledFactor);
  109.    }
  110.   }
  111.   if(img2 != null)
  112.   {
  113.    img3 = new ImageIcon(img2);
  114.    byte[] transition = imageIconToByteArray(img3);
  115.    if(Util.isValidJPEG(transition))
  116.    {
  117.     return imageIconToByteArray(img3);
  118.    }
  119.    else
  120.    {
  121.     System.gc();
  122.     return null;
  123.    }
  124.   }
  125.   else
  126.   {
  127.    System.gc();
  128.    return null;
  129.   }
  130.  }
  131.  else
  132.  {
  133.   System.gc();
  134.   return null;
  135.  }
  136. }
  137. else
  138. {
  139.  System.gc();
  140.  return null;
  141. }
  142. }


 
WeakReference m'aime pas trop

n°1574363
vashkiry
Posté le 13-06-2007 à 13:39:44  profilanswer
 

c'est la méthode principale de ma classe, elle apelle différentes autres methodes . c'est le code MIDP qui appelle cette methode sur le serveur

n°1574370
brisssou
8-/
Posté le 13-06-2007 à 13:48:15  profilanswer
 

je peux me tromper, mais appeler system.gc à tout bout de champ, a me semble pas être un signe de grande qualité du code.
 
tu peux peut-être utiliser un profiler et voir quels sont les objets qui s'amoncèlent, ça te donnerai la voie vers où chercher.


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
n°1574378
vashkiry
Posté le 13-06-2007 à 13:58:51  profilanswer
 

ouai mais comment je test ca avec mon .class qui sexecute sur un serveur?

n°1574402
brisssou
8-/
Posté le 13-06-2007 à 14:28:23  profilanswer
 

bha tu profiles ton serveur :)


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
n°1574408
vashkiry
Posté le 13-06-2007 à 14:31:29  profilanswer
 

ah bah bien sur ! suis je bete....
profilons nos serveurs, pendant ce temps je vais chercher une corde

n°1574414
flo850
moi je
Posté le 13-06-2007 à 14:35:43  profilanswer
 

deja , quand je vois ca  

Code :
  1. #
  2. img3 = new ImageIcon(img2);
  3. byte[] transition = imageIconToByteArray(img3);
  4. if(Util.isValidJPEG(transition))
  5. {
  6. return imageIconToByteArray(img3);
  7. }


 
je me demande pourquoi tu appelle  imageIconToByteArray(img3) deux fois, pourquoi tu instancie img3 ( un  imageIconToByteArray(new ImageIcon(img2))) fera pas de mal  
 

n°1574421
vashkiry
Posté le 13-06-2007 à 14:47:50  profilanswer
 

euh ouai, mais c'est un choix de programmeur je part du princip que si je l'appelle plusieurs fois et bien c'est plus simple de manipuler img3 que new ImageIcon(img2)

n°1574443
flo850
moi je
Posté le 13-06-2007 à 15:07:29  profilanswer
 

vashkiry a écrit :

euh ouai, mais c'est un choix de programmeur je part du princip que si je l'appelle plusieurs fois et bien c'est plus simple de manipuler img3 que new ImageIcon(img2)


sauf que dans ce contexte, tu ne l'appelle qu'une fois , c'est transition que tu appelle deux fois


Message édité par flo850 le 13-06-2007 à 15:07:56
n°1574449
brisssou
8-/
Posté le 13-06-2007 à 15:13:33  profilanswer
 

vashkiry a écrit :

ah bah bien sur ! suis je bete....
profilons nos serveurs, pendant ce temps je vais chercher une corde


tu découvres le travail ?
 
quand tu profiles ton serveur, tu exclus les classes de ton serveur.
 
vu la quantité de topics que tu crées depuis 15jours, tu pourrais être plus coopératif...


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
n°1574458
vashkiry
Posté le 13-06-2007 à 15:20:53  profilanswer
 

la variété et la quantité de mes topics est bien la preuve que j'essaie de travailler. j'aprecie vraiment votre aide mais mes competences et mon temps n'étant pas infini il n'est pas toujours possible de tout essayer....surtout quand c'est lourd.
 
Flo>> exact j'ai parlé trop vite

n°1574460
flo850
moi je
Posté le 13-06-2007 à 15:24:21  profilanswer
 

le but, c'est aps non plus qu'on fasse le taf a ta place, mais qu'on te donne des pistes

n°1574465
vashkiry
Posté le 13-06-2007 à 15:30:03  profilanswer
 

oui, j'aime le ski mais unikement les pistes vertes et bleues

n°1574474
flo850
moi je
Posté le 13-06-2007 à 15:42:00  profilanswer
 

ok , merci , va continuer a pondre tes merdes gangrénées et a  ne pas vouloir changer tes pratiques

n°1574476
vashkiry
Posté le 13-06-2007 à 15:50:42  profilanswer
 

le terme pratique est un peu vaste.. si tu parle de mon code html effectivement ce n'est pas mon fort mais je ne risque pas d'en refaire de si tot. mon taff est tres varié et j'essaie d'optimiser au mieu mon temps de travail. je suis donc desolé de ne pouvoir tester tous vos conseils faute de temps.

n°1575965
jyles
Posté le 17-06-2007 à 13:51:50  profilanswer
 

Appeler System.gc() n'empêche en rien les OutOfMemoryError, pour la bonne et simple raison que la JVM appelle System.gc() avant de lancer une OutOfMemoryError.
 
Soit il y a une memory leak quelque part, soit tu utilises plus de mémoire que tu n'en as alloué à ta JVM.
 
Passe l'option -Xmx<MEMSIZE>M pour spécifier une valeur plus grande que celle par défaut (64M je pense). Si ca continue de planter, même si tu rajoutes toujours plus de mémoire, il y a fort à parier que tu fais quelque chose de paaaabien et que ça provoque une memory leak.

n°1576095
vashkiry
Posté le 18-06-2007 à 09:46:24  profilanswer
 

quelque chose de pas bien ouai merci j'en étais à ce point du raisonnement.

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  out of mem

 

Sujets relatifs
Plus de sujets relatifs à : out of mem


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR