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

  1. #1
    Membre du Club
    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
    Points : 43
    Points
    43
    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 extrêmement actif 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
    Points : 814
    Points
    814
    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 ?
    Heureux soient les fêlés, car ils laisseront passer la lumière.

    Mieux vaut fermer sa gueule et passer pour un con que l'ouvrir et ne laisser aucun doute à ce sujet.

    Cours et tutoriels pour apprendre Java , FAQ Java, et Forum Java

  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 : 42
    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
    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 du Club
    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
    Points : 43
    Points
    43
    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
    Points : 3 083
    Points
    3 083
    Par défaut
    C'est ton "Application" qui n'est pas libérée. Comment la fermes-tu pour la rendre non-active ?
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  6. #6
    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 : 42
    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 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.

  7. #7
    Membre du Club
    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
    Points : 43
    Points
    43
    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.

  8. #8
    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,


    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

  9. #9
    Membre confirmé 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
    Points : 565
    Points
    565
    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 )
    C'est pas parce que ca marche que c'est bon!!
    Pensez au bouton "Résolu"
    Je ne réponds pas en privé aux questions

  10. #10
    Membre du Club
    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
    Points : 43
    Points
    43
    Par défaut
    Merci pour les conseils ! ... Je viens de me rendre compte qu'aucun appel de close() n'était effectué sur mes Statements ! Donc vous m'avez bien aiguillé sur le problème
    Je pensais que ceux-ci étaient directement libérés par le garbage collector mais ce n'est en fait pas le cas !

  11. #11
    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 globule71 Voir le message
    Je pensais que ceux-ci étaient directement libérés par le garbage collector mais ce n'est en fait pas le cas !
    Le GC ne peut libérer que la mémoire.

    Les statements utilisent des ressources propres aux drivers JDBC qui doivent être libérer manuellement.


    a++

  12. #12
    Membre du Club
    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
    Points : 43
    Points
    43
    Par défaut
    Merci pour la précision, je m'en souviendrai

+ 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