IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Application utilise trop de mémoire


Sujet :

Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 45
    Points : 18
    Points
    18
    Par défaut Application utilise trop de mémoire
    Bonsoir,

    J'ai une augmantation importante de la memoire ram avec ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
     [...]
     
    out = new ObjectOutputStream(socket.getOutputStream());
    in = new ObjectInputStream(socket.getInputStream());
     
    while (true) {  	
     
    ImageIcon img = (ImageIcon) in.readObject();
     
     try {
     
    canvas.setBackgroundImage(makeSWTImage(d,img.getImage()));	
     
     } catch (OutOfMemoryError e) {
     
    System.gc();
    } catch (Exception e) {
    // TODO Auto-generated catch block
    										e.printStackTrace();
     
      }
    );			        	        
     
     
     }
    Je fais des captures d'ecran dans une boucle while... La mémoire augemente petit a petit... Je crois avoir trouver le coupable, cette fonction: makeSWTImage(d, img.getImage()) //elle permet de convertire une image AWT en une image SWT

    Voici cette fameuse fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
     org.eclipse.swt.graphics.Image makeSWTImage(Display display, java.awt.Image ai)
    	    throws Exception
    	  {
    	    int width = ai.getWidth(null);
    	    int height = ai.getHeight(null);
    	    BufferedImage bufferedImage = null;
    	    bufferedImage =  new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    	    Graphics2D g2d = null;
    	    	g2d = bufferedImage.createGraphics();
    	    g2d.drawImage(ai, 0, 0, null);
    	    g2d.dispose();
    	    int[] data = null;
    	      data = ((DataBufferInt)bufferedImage.getData().getDataBuffer())
    	      .getData();
    	    ImageData imageData = null;
    	     imageData = new ImageData(width, height, 24,
    	        new PaletteData(0xFF0000, 0x00FF00, 0x0000FF));
    	    imageData.setPixels(0, 0, data.length, data, 0);
    	    org.eclipse.swt.graphics.Image swtImage = new org.eclipse.swt.graphics.Image(display, imageData);
     
    	    return swtImage;
    	  }
    Apres plusieurs jours de recherche et de galère j'espère que vous pourrez me donner un petit coup de main ^^

    Merci.

    Olivier

  2. #2
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Bonjour, à priori, tu ne fermes pas les streams que tu ouvres (out et in). FAQ : Comment libérer proprement les ressources (ou comment utiliser proprement les bloc try/finally) ?

  3. #3
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Le bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    catch (OutOfMemoryError e) {
     
    System.gc();
    }
    est parfaitement inutile.

  4. #4
    Membre habitué Avatar de we.are.the.storm
    Profil pro
    Inscrit en
    Février 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 115
    Points : 139
    Points
    139
    Par défaut
    Il faut également éviter de créer des variables à l'intérieur des boucles (même temporaires)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (true) {
        ImageIcon img = (ImageIcon) in.readObject(); //va allouer un nouvel espace mémoire pour stocker un ImageIcon à chaque passage dans la boucle. 
        ...
    }
    La manière vue ci-dessus va donner beaucoup de travail inutile au GarbageCollector. Il est recommandé de procéder à la création de variable en dehors des boucles, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ImageIcon img = null;
    while (true) {
        img = (ImageIcon) in.readObject(); //va utiliser toujours le même espace mémoire, alloué avant l'entrée dans la boucle. 
        ...
    }
    De la même manière comme la méthode makeSWTImage(...) est appelée dans la boucle il faut éviter au possible d'y créer des variables temporaires. BufferedImage, Graphics2D, ImageData, etc pourrait être stockées en tant qu'attribut de la classe qui contient la méthode. (Quitte à ne pas y mettre d'accésseur public puisque c'est pour un usage d'optimisation interne à la classe).

  5. #5
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Points : 1 996
    Points
    1 996
    Par défaut
    Bonjour,

    Citation Envoyé par we.are.the.storm Voir le message
    Il faut également éviter de créer des variables à l'intérieur des boucles (même temporaires)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (true) {
        ImageIcon img = (ImageIcon) in.readObject(); //va allouer un nouvel espace mémoire pour stocker un ImageIcon à chaque passage dans la boucle. 
        ...
    }
    La manière vue ci-dessus va donner beaucoup de travail inutile au GarbageCollector. Il est recommandé de procéder à la création de variable en dehors des boucles, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ImageIcon img = null;
    while (true) {
        img = (ImageIcon) in.readObject(); //va utiliser toujours le même espace mémoire, alloué avant l'entrée dans la boucle. 
        ...
    }
    De la même manière comme la méthode makeSWTImage(...) est appelée dans la boucle il faut éviter au possible d'y créer des variables temporaires. BufferedImage, Graphics2D, ImageData, etc pourrait être stockées en tant qu'attribut de la classe qui contient la méthode. (Quitte à ne pas y mettre d'accésseur public puisque c'est pour un usage d'optimisation interne à la classe).
    @we.are.the.storm: Tes deux codes sont identiques. Sauf que dans le premier, la variable img est seulement visible que dans le bloc 'while' tandis que le deuxième img est visible dans le bloc parent du while (donc aussi dans le bloc 'while').

  6. #6
    Membre habitué Avatar de we.are.the.storm
    Profil pro
    Inscrit en
    Février 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 115
    Points : 139
    Points
    139
    Par défaut
    @we.are.the.storm: Tes deux codes sont identiques. Sauf que dans le premier, la variable img est seulement visible que dans le bloc 'while' tandis que le deuxième img est visible dans le bloc parent du while (donc aussi dans le bloc 'while').
    Le but ici n'est pas de modifier le comportement du code mais bien d'optimiser la consommation en ressources mémoire.

  7. #7
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Points : 1 996
    Points
    1 996
    Par défaut
    Tu n'as compris mon message.

    Ta solution n'économise pas de ressource mémoire. Tes deux codes consomment la même quantité de mémoire.....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while (true) {
        ImageIcon img = (ImageIcon) in.readObject(); //va allouer un nouvel espace mémoire pour stocker un ImageIcon à chaque passage dans la boucle. 
        ...
    }
    La charge de travail du "Garbage Collector" sera la même si tu déclares la variable hors de la boucle. Seule la visibilité de la variable est changée.

  8. #8
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par we.are.the.storm Voir le message
    Le but ici n'est pas de modifier le comportement du code mais bien d'optimiser la consommation en ressources mémoire.
    Attention, la solution que tu proposes est pire, car tu as oublié un détail.
    Exemple concret, ça revient à peut près à ce que tu proposes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int[] tab = null;
    for( int i = 0 ; i < 3 ; ++i )
    {
    	tab = new int[ 14 * 1024 * 1024 ];
    	System.out.println( i );
    }
    Ce code plante à la deuxième itération de boucle (si la mémoire allouée à la JVM reste par défaut, 64Mo).
    Par contre, le code suivant est bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int[] tab = null;
    for( int i = 0 ; i < 3 ; ++i )
    {
    	tab = null;
    	tab = new int[ 14 * 1024 * 1024 ];
    	System.out.println( i );
    }
    La mémoire allouée à "tab" est d'abord libérée, puis un nouveau tableau est construit.

    Mis à part ce détail, je suis d'accord avec toi : autant conserver un pointeur unique en le déclarant en dehors de la boucle. C'est pas grand chose de gagné, mais c'est toujours bon à prendre. Par contre, il faut vraiment mettre un commentaire pour la mise à null de la variable avant une nouvelle déclaration.

  9. #9
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Points : 1 996
    Points
    1 996
    Par défaut
    Essayez donc ce petit exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    public void testMemory(int test) {
    		switch (test) {
    			case 0: {
    				int[] tab = null;
    				for( int i = 0 ; i < 3 ; ++i ) {
    					tab = new int[ 14 * 1024 * 1024 ];
                                            Arrays.fill(tab, i);
    					System.out.println( i );
    				}
    				break;
    			}
    			case 1: {
    				int[] tab = null;
    				for( int i = 0 ; i < 3 ; ++i ) {
    					tab = null;
    					tab = new int[ 14 * 1024 * 1024 ];
                                            Arrays.fill(tab, i);
    					System.out.println( i );
    				}				
    				break;
    			}
    			default:
    			for( int i = 0 ; i < 3 ; ++i ) {
    				int[] tab = new int[ 14 * 1024 * 1024 ];
                                    Arrays.fill(tab, i);
    				System.out.println( i );
    			}	
    			;			
    		}
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    for (int i = 0; i < 3; ++i) {
       try {
    	testMemory(i);
       }
       catch(Throwable t) {
    	System.err.println("Test "+i+" Error >> " + t.getMessage());
    	System.err.flush();
       }
       System.out.flush();
    }
    Me donne ce résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Test 0
    0
    Test 0 Error >> Java heap space
    Test 1
    0
    1
    2
    Test 2
    0
    1
    2
    Donc pas besoin de mettre des variables à null, il suffit de bien faire les choses

    J'ai l'habitude de déclarer mes variables (variant) à l'intérieur de la structure de contrôle si elles ne sont utilisées qu'à l'intérieur du bloc.

  10. #10
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    +1 avec jowo : le tiercé compilateur/JVM/GC sait très bien optimiser ce cas de figure.
    En général en Java il est préférable de diminuer le scope des variables plutôt que de l'augmenter...

    L'espace mémoire (ridiculement petit) utilisé par la référence ne sera pas recréé à chaque itération, mais seulement au tout début. Par contre l'objet référencé est bien libérable dès la fin d'une iteration

    D'ailleurs , si je reprend ton exemple je n'ai pas d'OoM avec -Xmx64M :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	for( int i = 0 ; i < 3 ; ++i ) {
    		int[] tab = new int[ 14 * 1024 * 1024 ];
    		System.out.println( i );
    	}

    Le seul cas où il est utile de sortir une variable de la boucle, c'est justement dans le cas où l'on n'a pas une variable mais une "constante", c'est à dire lorsque l'objet sera strictement identique pendant toutes les itérations.
    Inutile de recréer le même objet à chaque fois...

    a++

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 45
    Points : 18
    Points
    18
    Par défaut
    Bonsoir tout le monde, merci pour vos réponses

    J'ai oublier de préciser que le tout est dans un thread... et il ne doit pas s'arrêter (seulement lors de la fermeture de la fenêtre).

    J'ai mis a 'Null' toutes le variables de m'a fonction makeSWTImage(...)... mais c'est toujours pareil, j'ai ce super message:

    Exception in thread "Thread-0" java.lang.OutOfMemoryError: Java heap space

    Je supprime: canvas.setBackgroundImage(makeSWTImage(d, img.getImage()));

    Je recois pas cette erreur... elle pourrait provenir du canvas? qu'il ne supprime pas l'image précédente?

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 45
    Points : 18
    Points
    18
    Par défaut
    Bonsoir,

    J'utilise aussi ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
    dans la boucle While... Mais je peut pas les fermer (out.Close()) dans la boucle sinon je recoi une erreur...

    Je vois pas comment régler ce problème, alor que le thread doit pas être arrêter.

    Une idée?

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 45
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    Si je supprime le thread je n'est pas ce probleme de memoire... Mais bon je d'oit l'avoir ce thread

    D'apres ce que j'ai trouver, les objets qui son dans un thread ne sont pas detruit par le 'Grabage Collector'

    Il doit surement avoir une solution?

  14. #14
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par blaster681 Voir le message
    D'apres ce que j'ai trouver, les objets qui son dans un thread ne sont pas detruit par le 'Grabage Collector'
    FAUX !!!

    Je rappelle quand même que la méthode main() est exécuté dans un thread... donc cela voudrait dire que rien ne serait libéré par le GC !!!

    Citation Envoyé par blaster681 Voir le message
    Il doit surement avoir une solution?
    Oui :

    • Gérer proprement le scope des références utilisées (mais le peut de code que tu nous fournis n'est pas suffisant pour vérifier cela).
    • Libérer proprement les ressources externes (qui ne sont donc pas géré par le GC). Lire : Comment libérer proprement les ressources (ou comment utiliser proprement les bloc try/finally) ?
      (ce que tu ne sembles pas faire dans le peu de code que tu as donné - de plus il semblerait d'après la doc que la classe Image doit également être libéré explicitement via dispose())



    Le problème ne vient pas du GC mais de ton code !

    a++

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 45
    Points : 18
    Points
    18
    Par défaut
    Merci pour ta reponse adiGuba.

    Je vous mets le code complet:

    Class start:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    public class start {
     
    	/**
             * @param args
             */
     
    	public static void main(String[] args) {
    		final Display d = new Display();
    		final Shell shell = new Shell(d);
    		shell.setSize(800, 800);
    		shell.setLayout(new FillLayout());
     
    		 final Canvas canvas = new Canvas(shell, SWT.NONE);
     
    			// Thread t = new Thread() {
    			       // public void run() {        
    			robot r = new robot();
    			r.srceen(d, canvas);
    			  //      }
    		    //  };
    		      //t.start();
     
    		shell.open();
     
    		while(!shell.isDisposed()) {
    			if (d.readAndDispatch())
    				d.sleep();
    		}
    		d.dispose();
    	}
     
    }
    Class robot:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    public class robot {
     
    	java.awt.Image image =null;	
    	BufferedImage img=null;
    	GC gc = null;
    	public void srceen(final Display d, final Canvas canvas) {
    		final Rectangle  rec = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
     
    		 Thread t = new Thread() {
    		       public void run() {   
     
    		 while( true ) {
    			 Robot robot = null;
    			try {
    				robot = new Robot();
    			} catch (AWTException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			}
    				img = robot.createScreenCapture(rec);
    				image = img;		
    			robot = null;
    				try {
    					d.asyncExec(new Runnable() {
    						public void run() {
    							try {
    								gc = null;
    								 gc = new GC(canvas);
    								 aToS t = new aToS();
    								gc.drawImage(t.makeSWTImage(d, image), 0, 0);					
    							} catch (Exception e) {
    								// TODO Auto-generated catch block
    								e.printStackTrace();
    							} finally {					
    									gc.dispose();
    									img.flush();
    									image.flush();
    							}
    						}
    					}
    						);
     
    				} catch (Exception e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    		 }
    		       }
    		 };
    		 t.start();   
    		 }
    }
    et enfin la class aToS:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    public class aToS {
    	Image makeSWTImage(Display display, java.awt.Image ai)
        throws Exception
      {
        int width = ai.getWidth(null);
        int height = ai.getHeight(null);
        BufferedImage bufferedImage =
          new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = bufferedImage.createGraphics();
        g2d.drawImage(ai, 0, 0, null);
        g2d.dispose();
        int[] data =
      ( (DataBufferInt)bufferedImage.getData().getDataBuffer())
          .getData();
     
        ImageData imageData =
          new ImageData(width, height, 24,
            new PaletteData(0xFF0000, 0x00FF00, 0x0000FF));
        imageData.setPixels(0, 0, data.length, data, 0);
        Image swtImage = new Image(display, imageData);
     
        bufferedImage = null;
        g2d = null;
        data = null;
        imageData = null;
     
        return swtImage;
      }
    }
    Voila vous avez tout Il y a certainement des Object = null; qui servent a rien... mais depuis deux jours j'ai tourner le code dans tout les sens ^^
    (Ce n'est pas mon projet, mais une simple simulation du probleme)

    @ ++

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 45
    Points : 18
    Points
    18
    Par défaut
    Personne pour me filer une piste?

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 45
    Points : 18
    Points
    18
    Par défaut
    Bon je me répond a moi même

    Espèse d'idiot tu aurrais dû faire sa:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    [...]
     
    gc = new GC(canvas);
    aToS c = new aToS();
    Image i = c.makeSWTImage(d, image);
    gc.drawImage(i, 0, 0);
    i.Dispose();     // De préférence dans un bloc finally mais je voulais pas remettre tout le code :mrgreen:
    [...]
    Voila ce qui arrive apres avoir fais une bonne grasse mat'

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 45
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    J'ai le même genre de problème avec un autre code mais sans aucun message d'erreur, la mémoire augmente constamment...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    public class serverStart {
     
    	ServerSocket ser;
    	Socket con;
    	ObjectOutputStream out;
    	ObjectInputStream in;
     
    	public serverStart() {
     
    	}
     
    	void ejecutar(){
     
    	try{
    	ser = new ServerSocket( 5700,1 );
    	con = ser.accept();
    	out= new ObjectOutputStream(con.getOutputStream());
    	out.flush();
    	in= new ObjectInputStream(con.getInputStream());
    	procesar();
    	}
    	catch(IOException e){}
    	}
     
    	void procesar() throws IOException{
     
    	while(true){
    	try{
     
    		Robot r = new Robot();
     
    		BufferedImage buffer = r.createScreenCapture(new Rectangle(200, 200, 800, 800));
    		ImageIcon i = new ImageIcon(buffer);
    		out.writeObject( (ImageIcon) i );
    		buffer = null;
    	}catch(IOException e){} catch (AWTException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	} finally {
    		out.reset();
    		System.out.println("finally");
    	}
    	}
     
    	}
     
    	public static void main(String args[]) {
    		serverStart srv = new serverStart();
    	srv.ejecutar();
    	}
    Je suis pas sur mais je pense que sa vien du-faite que le out.writeObject( (ImageIcon) i ); est dans une boucle infinie... et qu'il ne se ferme que une fois l'application fermer. Mais je suis obliger d'envoyer en boucle les images...

    Mon projet consiste a faire un logiciel client/serveur pour faire du contrôle a distance.

    Vous avez une solution?
    Merci.

    Olivier

  19. #19
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    La réponse t'a déjà été donné :
    Citation Envoyé par CheryBen Voir le message
    Bonjour, à priori, tu ne fermes pas les streams que tu ouvres (out et in). FAQ : Comment libérer proprement les ressources (ou comment utiliser proprement les bloc try/finally) ?
    a++

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 45
    Points : 18
    Points
    18
    Par défaut
    Je sais sa mais je peut pas fermer mon output dans la boucle while... et vu que c'est une boucle infini le .close() externe a la boucle dans le finally se déclenchera jamais

    ou je dois a nouveau faire un new ObjectOutputStream(con.getOutputStream()); ?

    Ou je me plante entièrement

Discussions similaires

  1. plantage ouverture formulaire -> trop de mémoire utilisée ?
    Par homerlehamster dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/07/2012, 09h38
  2. Trop de mémoire utilisée pour rien
    Par MonsieurPouet dans le forum Administration système
    Réponses: 9
    Dernier message: 27/02/2012, 10h27
  3. Process Apache qui utilise trop de mémoire
    Par charline_irlande dans le forum Apache
    Réponses: 2
    Dernier message: 26/10/2009, 17h29
  4. Trop de mémoire utilisée par SQL Server
    Par sylvie75 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 24/08/2006, 12h46
  5. Utilisation de la mémoire vive....
    Par Neilos dans le forum Windows
    Réponses: 9
    Dernier message: 24/11/2003, 11h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo