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

avec Java Discussion :

Gestion d'un OutOfMemory


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2007
    Messages : 85
    Par défaut Gestion d'un OutOfMemory
    Bonjour à tous !

    J'aimerai mettre en place une solution permettant de contourner une exception arrivant de temps en temps

    Je sais que c'est du bidouillage mais j'ai pour l'instant mis en place ceci dans mon 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
    27
    28
    29
    30
    31
    32
    33
    		boolean actif = false;
    		Application application;
    		while(true)
    		{
    			if(!actif)
    			{
    				try
    				{
    					application =new Application();
    					actif=true;
    				}
    				catch (OutOfMemoryError e) 
    				{
    					actif=false;
    					application = null;
    					System.gc();
    					e.printStackTrace();
    				}
    				catch (Exception e) {
    					e.printStackTrace();
    					application = null;
    					System.gc();
    					e.printStackTrace();
    				}
    			}
    			try {
    				Thread.sleep(10000);
    				System.out.println("10sec");
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    Au passage, Application est en fait une application graphique lançant plusieurs threads au moment de sa construction. J'espère juste que les exceptions eventuellement lancée par l'application en générale sont bien catchée et que celle-ci se "regénère" toute seule...

    Que pensez vous de cette solution ? :s
    Je l'utiliserai bien en attendant de pouvoir trouver d'ou vient mes fuites de mémoires...
    Et peut-on être sûr que le "outOfMemoryException" ne sera pas lancé par le thread principale ayant pour objectif qu'une tempo de 10 sec ? Et qui du coup ne sera pas catché...

  2. #2
    Membre émérite Avatar de jojodu31
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Par défaut
    on ne peut pas te dire de passer outre un OutOfMem ... enfin moi je peux aps en tout cas, as tu exuté ton programme en mode debug pour voir ?

  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 : 44
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Non, il ne faut jamais faire ça. Le OutOfMemoryError est une erreur très grave, il ne faut pas chercher à la catcher.
    Cherche ou tu peux limiter l'utilisation de mémoire, peut-être qu'il y a des fuites et/ou augmente la mémoire allouée à la JVM.

    EDIT : trop lent
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2007
    Messages : 85
    Par défaut
    Il y'a bel et bien des fuites de mémoire... J'ai beau augmenter la taille de la mémoire, j'arrive à tout utiliser au bout d'un moment.
    A un endroit de l'application j'ai un while(true), je suppose que c'est dans cette boucle que je dois avoir une fuite mémoire.
    Comment faire pour forcer la JVM à supprimer les objets non utilisés à chaque début du while(true) ?

  5. #5
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    C'est ton "Application" qui n'est pas libérée. Comment la fermes-tu pour la rendre non-active ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2007
    Messages : 85
    Par défaut
    Citation Envoyé par natha Voir le message
    C'est ton "Application" qui n'est pas libérée. Comment la fermes-tu pour la rendre non-active ?
    Via un bouton : Fermeture des threads, sauvegarde de fichiers de configuration puis Systeme.exit(0).


    Mais c'est tant que l'objet application est ouvert justement que j'ai des OutOfMem...
    Niveau architecture, des threads sont créés à l'intérieur même d'objets graphiques, par exemple, à chaque ajout d'onglet, un thread démarre et c'est le début d'une boucle de travail travaillant sur plusieurs jours tout en attaquant une base de données MySQL. la connexion à la base de données est initialisées qu'une seule fois puis des opération identiques sont effectuées toutes les 30 sec... Cependant au bout de plusieurs 10enes d'heure, j'ai ce OutOfMem qui saute à l'écran... Je n'arrive pas à trouver la cause de cette fuite mémoire.

  7. #7
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    Un profiler pourrait surement t'aider...

    Sinon quelques idées en vrac :
    • L'abus de varaible static, qui ne peuvent donc pas être libérée.
    • Des collections qui grossissent indéfiniment.
    • Des ressources JDBC qui ne sont pas libérées pas avec close()
    • Des instances qui se référencent de tous les cotés.
    • ...


    Bon courage...

    a++

    PS : Et ce n'est vraiment pas beau ce catcher une OutOfMemory

  8. #8
    Membre chevronné Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Par défaut
    Citation Envoyé par globule71 Voir le message
    Via un bouton : Fermeture des threads, sauvegarde de fichiers de configuration puis Systeme.exit(0).


    Mais c'est tant que l'objet application est ouvert justement que j'ai des OutOfMem...
    Niveau architecture, des threads sont créés à l'intérieur même d'objets graphiques, par exemple, à chaque ajout d'onglet, un thread démarre et c'est le début d'une boucle de travail travaillant sur plusieurs jours tout en attaquant une base de données MySQL. la connexion à la base de données est initialisées qu'une seule fois puis des opération identiques sont effectuées toutes les 30 sec... Cependant au bout de plusieurs 10enes d'heure, j'ai ce OutOfMem qui saute à l'écran... Je n'arrive pas à trouver la cause de cette fuite mémoire.
    Vérifie que les trucs qui sont lancés toutes les 30 sec libérent bien la mémoire. ( pas de variable qui traine, de pool non libéré etc )

  9. #9
    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 : 44
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par globule71 Voir le message
    Comment faire pour forcer la JVM à supprimer les objets non utilisés à chaque début du while(true) ?
    Le OutOfMemory signifie que la JVM a fait tout son possible pour libérer de la mémoire mais n'a pas réussi. Lors de la levée de l'erreur, tous les objets sont utiliser.
    C'est donc ton programme qui est en cause. Tu dois stocker des références quelque part et les conserver jusqu'à la mort de la JVM par asphyxie
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/08/2002, 21h37
  2. Gestion de matrice
    Par bzd dans le forum C
    Réponses: 4
    Dernier message: 12/08/2002, 18h19
  3. Réponses: 4
    Dernier message: 04/07/2002, 12h31
  4. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11
  5. gestion d'un joystick ...
    Par Anonymous dans le forum DirectX
    Réponses: 1
    Dernier message: 23/05/2002, 12h53

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