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

Tomcat et TomEE Java Discussion :

[tomcat][memoire] java.net.URL et fuite mémoire


Sujet :

Tomcat et TomEE Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 43
    Points : 25
    Points
    25
    Par défaut [tomcat][memoire] java.net.URL et fuite mémoire
    Coucou à tous,

    Pas génial mon problème : à une certaine ligne de mon code, parfois je perd 0, 10, 15 ou 20 Mo dans la mémoire jvm... jusqu'à saturation de la mémoire, rallentissement, puis plantage de Cocoon qui ne me renvoie plus que <html><body></body></html>...

    Voici le fameux code, réduit à l'essentiel :

    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
     
    InputStream source = null;
    for&#40;int i = 0; i &lt; nomsBases.size&#40;&#41;; i++&#41; &#123;
    	source = null;
    	try &#123;
    		affMemoire&#40;"avant URL source"&#41;;
    		source = new java.net.URL&#40;adressesRSS.get&#40;i&#41;.toString&#40;&#41;&#41;.openStream&#40;&#41;;		//¤ PERTE DE MÉMOIRE ICI
    		affMemoire&#40;"apres URL source"&#41;;
    	&#125;
    	catch&#40;Exception e&#41; &#123;
    		e.printStackTrace&#40;&#41;;
    	&#125;
    	finally &#123;
    		try &#123;
    			if&#40;source != null&#41;
    				source.close&#40;&#41;;
    		&#125;
    		catch&#40;Exception e&#41; &#123;
    			e.printStackTrace&#40;&#41;;
    		&#125;
    	&#125;
    &#125;

    affMemoire() me permet d'afficher la memoire restante dans la console (Runtime.getRuntime().totalMemory() et Runtime.getRuntime().maxMemory()). Donc je sais exactement quelle ligne est fautive.

    Si je lance Runtime.getRuntime().gc() à la fin de la boucle, c'est pire : c'est très lent, et à chaque tour de boucle ou presque je perd 2 Mo. Sans gc() c'est une perte d'environ 15 Mo, une fois toutes les 4 actualisations de la page (environ) (la boucle tourne 7 fois par actualisation).

    C'est plutôt gênant, si je ne corrige pas ça, le serveur web va planter tous les 10 jours ! :/ (ce traitement ne se lance qu'une fois par jour)

    Merci beaucoup, il en va de la survie de l'espèce humaine !

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 43
    Points : 25
    Points
    25
    Par défaut
    Petite précision : au 1er tour de boucle de la première exécution, je perds toujours 9 Mo (le total passe de 18 à 27 Mo). Après c'est variable, des fois la ligne s'exécute 10 ou 20 fois sans perte...

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 43
    Points : 25
    Points
    25
    Par défaut
    Autre précision : les URL ouvertes sont des pages dynamiques générées par le même serveur qui exécute mon code (ce sont des fils RSS). Le but est justement de copier ces fichiers dynamiques pour en faire des fichiers sur le disque, et les rafraîchir toutes les 24h. Bon, ça marche, mais ça pompe la mémoire...

    J'ai l'impression que c'est la création dynamique du fichier RSS qui utilise la mémoire ?? (cette création entraîne des requêtes dans une base xml) C'est peut-être pas mon code alors...

    Je vais tester avec une URL externe, j'aurais la réponse !!

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 43
    Points : 25
    Points
    25
    Par défaut
    Résultat : pas de pertes avec une URL d'un autre serveur du réseau local...

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 43
    Points : 25
    Points
    25
    Par défaut
    Suite du monologue

    Le problème vient bien de la création du fichier rss et non pas du code ci-dessus : plus on demande la création du fichier, moins gc() arrive à libérer de mémoire : csq au bout de plusieurs dizaines de fois : OutOfMemory......

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 43
    Points : 25
    Points
    25
    Par défaut
    Résolu

    En fait, j'ai rien fait ! La solution est venue toute seule au retour de la pause café : après moultes plantage(s) OutOfMemory, 5 ou 10 minutes d'attente sans toucher au serveur et hop! magie, 70 Mo libérés sans même redémarrer le serveur !

    Désolé pour le faux topic résolu tout seul.......

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 26
    Points : 21
    Points
    21
    Par défaut
    Bonjour bonjour !

    Bon... juillet 2004... désolé de rouvrir le topic, mais j'ai un peu un problème similaire (alors comme il faut regarder les autres topics avant d'en ouvrir un nouveau, je me permets) :

    Lorsque mes JSP sont appelées par un navigateur et compilées/exécutées sur Tomcat, une partie de la mémoire de la JVM de Tomcat est allouée et n'est libérée qu'à l'ouverture de la page suivante par la même session-utilisateur.

    La quantité de cette mémoire est variable selon la page mais constante par page (ex : telle page prend 15 mo à chaque exécution).
    De même, certaines variables doivent être mutualisées (les statics ?), puisqu'une page qui prend 15 mo pour un utilisateur ne prend pas 30 mais 20 mo pour deux utilisateurs.

    Le problème étant que, même après expiration de la session de l'utilisateur (dans la mesure où la plupart des utilisateurs n'utilisent pas la fonction "déconnexion" qui arrangerait grandement mes problèmes puisqu'elle détruit directement la session et semble débloquer quelque chose qui aide le gc a libéré la mémoire), une partie de cette mémoire reste allouée pour des objets qui ne semblent pas avoir de références.

    A noté que la plupart des objets passe très vite en tenured space d'où leur suppression semble difficile par la JVM...

    Si quelqu'un a une idée, merci d'avance

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

Discussions similaires

  1. java.net.URL et Weblogic
    Par bruno10 dans le forum Weblogic
    Réponses: 4
    Dernier message: 10/04/2013, 12h42
  2. Problème avec java.net.url
    Par ismaas dans le forum GWT et Vaadin
    Réponses: 6
    Dernier message: 30/11/2012, 17h50
  3. Tester une connexion java.net.URL
    Par KRis dans le forum Langage
    Réponses: 4
    Dernier message: 14/09/2010, 10h40
  4. java.net.URL et serveur Tomcat
    Par nin2 dans le forum Langage
    Réponses: 3
    Dernier message: 23/08/2010, 18h57
  5. java.net.URL + arborescence
    Par franfr57 dans le forum Général Java
    Réponses: 1
    Dernier message: 13/08/2009, 20h25

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