out of mem

out of mem - Java - Programmation

Marsh Posté le 13-06-2007 à 10:45:19    

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

Reply

Marsh Posté le 13-06-2007 à 10:45:19   

Reply

Marsh Posté le 13-06-2007 à 10:48:58    

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 )  

Reply

Marsh Posté le 13-06-2007 à 10:56:11    

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

Reply

Marsh Posté le 13-06-2007 à 11:31:14    

rm -rf *


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 13-06-2007 à 11:40:53    

comment ca s'utilise???

Reply

Marsh Posté le 13-06-2007 à 11:44:05    

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???

Reply

Marsh Posté le 13-06-2007 à 11:46:57    

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

Reply

Marsh Posté le 13-06-2007 à 11:59:17    

rien pour un ramasse miette JAVA performant??

Reply

Marsh Posté le 13-06-2007 à 12:02:20    

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
Reply

Marsh Posté le 13-06-2007 à 12:05:24    

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.
 

Reply

Marsh Posté le 13-06-2007 à 12:05:24   

Reply

Marsh Posté le 13-06-2007 à 12:06:00    

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...

Reply

Marsh Posté le 13-06-2007 à 12:08:00    

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

Reply

Marsh Posté le 13-06-2007 à 12:09:50    

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

Reply

Marsh Posté le 13-06-2007 à 12:10:54    

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

Reply

Marsh Posté le 13-06-2007 à 13:38:38    

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

Reply

Marsh Posté le 13-06-2007 à 13:39:44    

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

Reply

Marsh Posté le 13-06-2007 à 13:48:15    

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
Reply

Marsh Posté le 13-06-2007 à 13:58:51    

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

Reply

Marsh Posté le 13-06-2007 à 14:28:23    

bha tu profiles ton serveur :)


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 13-06-2007 à 14:31:29    

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

Reply

Marsh Posté le 13-06-2007 à 14:35:43    

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  
 

Reply

Marsh Posté le 13-06-2007 à 14:47:50    

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)

Reply

Marsh Posté le 13-06-2007 à 15:07:29    

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
Reply

Marsh Posté le 13-06-2007 à 15:13:33    

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
Reply

Marsh Posté le 13-06-2007 à 15:20:53    

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

Reply

Marsh Posté le 13-06-2007 à 15:24:21    

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

Reply

Marsh Posté le 13-06-2007 à 15:30:03    

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

Reply

Marsh Posté le 13-06-2007 à 15:42:00    

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

Reply

Marsh Posté le 13-06-2007 à 15:50:42    

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.

Reply

Marsh Posté le 17-06-2007 à 13:51:50    

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.

Reply

Marsh Posté le 18-06-2007 à 09:46:24    

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed