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

Langage Java Discussion :

Gestion de la mémoire


Sujet :

Langage Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 114
    Points : 57
    Points
    57
    Par défaut Gestion de la mémoire
    Bonjour,

    j'ai quelques problèmes de gestion de mémoire avec une application qui construit un modèle statistique : selon mes calculs, elle devrait n'utiliser qu'environ 300 Mo, or même en mettant le paramètre -mx1024m, au bout d'un certain temps, j'ai droit à un heap space. J'ai fait mon possible pour que la mémoire utilisée ne dépasse pas un certain seuil en utilisant des variables locales, en faisant des lectures/écritures avec des tampons de taille limitée, etc. et elle augmente tout de même petit à petit.
    Est-ce qu'il y a des erreurs typiques avec ce symptome ? Est-il possible, comme le processus dure plusieurs heures et manipule une assez grande quantité de données, que le garbage collector ne supprime pas tous les objets qu'il faudrait et que petit à petit la mémoire augmente (je sais, je rejette la faute...) ?

  2. #2
    Membre éclairé

    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 510
    Points : 803
    Points
    803
    Par défaut
    salut,
    a propos du GC il faut savoir qu'il faut éviter les variables "static" si je me souvient bien elles ont comme durée de vie celle de l'appli (a vérifier) donc si tu en créé en permanence elle ne sont pas liberer par le GC et tu te retrouve avec une fuite de mémoire conséquente.
    je ne sais pas si ca vient de la mais c'est peut etre une piste...

    a +
    "La seule chose dont je sois certain, c'est que je doute"
    j'ai cassé ma boule de cristal veuillez être clair et précis dans vos propos
    compilateur - 1 nayah - 0
    PS : je suis un

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 114
    Points : 57
    Points
    57
    Par défaut
    Merci pour ta réponse. Je pense que ce n'est pas le cas, je n'ai des variables statiques que dans les attributs de mes classes. En revanche, j'ai une sorte de classe outil avec plein de méthodes statiques que j'utilise beaucoup. Est-ce que le problème pourrait venir de là ? A priori je pense que non car les classes Math et même System fonctionnent comme cela ; pour être sûr j'ai testé de lancer 100 millions de fois une de ces méthodes avec un -mx10 et le processus s'est terminé. J'ai bien revérifié le code, je ne trouve aucun objet qui traine (qui ne serait pas local et néanmoins instancié plusieurs fois, ou qui reste en mémoire pour rien).

  4. #4
    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 yarf Voir le message
    Je pense que ce n'est pas le cas, je n'ai des variables statiques que dans les attributs de mes classes.
    Que veux tu dire par là exactement ???

    Citation Envoyé par yarf Voir le message
    En revanche, j'ai une sorte de classe outil avec plein de méthodes statiques que j'utilise beaucoup. Est-ce que le problème pourrait venir de là ?
    Non les méthodes static ne pose pas de problème. Enfin pas directement : le problème avec les éléments static vient si tu utilises abusivement des attributs static comme variable (car un attribut static n'est pas libérable si tu ne le met pas explicitement à null).

    Citation Envoyé par yarf Voir le message
    J'ai bien revérifié le code, je ne trouve aucun objet qui traine (qui ne serait pas local et néanmoins instancié plusieurs fois, ou qui reste en mémoire pour rien).
    S'il n'est pas trop long, cela pourrait être intéressant de voir certaines parties du code


    a++

  5. #5
    Membre éclairé

    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 510
    Points : 803
    Points
    803
    Par défaut
    si la mémoire utilisé augment autant ca veut dire que le GC n'arrive pas a supprimer certaine chose a ta place j'essairai de voir dans les tutos ce qu'ils disent sur le GC...

    d'aprés mes souvenirs il faut :
    -limiter la portée des objets
    -n'utiliser les attributs static que pour les constantes (au niveau des variables) ou s'assurer qu'elles sont null quand on en a plus besoin
    - preferer variables locales aux variables d'instance,
    - liberer les ressources (flux entrée/sortie) car elles ne sont pas géré par le GC

    je te renvoie a ce threads :ici
    "La seule chose dont je sois certain, c'est que je doute"
    j'ai cassé ma boule de cristal veuillez être clair et précis dans vos propos
    compilateur - 1 nayah - 0
    PS : je suis un

  6. #6
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Sinon, ca vaut ce que ça vaut, mais tenter un appel explicite au garbage collector peut aider. Il se peut que la machine virtuelle soit à la peine pour gérer la multitude d'objets et qu'elle ne libère pas la mémoire comme elle devrait.

    Tu pourrais donc essayer un "System.gc()" quelque part dans ton code et voire si ca améliore les choses.

    Fred
    Développeur Java / Flex à Shanghai, Chine
    mes publications
    Mon dernier tutoriel : Messages Quit IRC : explications

    La rubrique IRC recrute des redacteurs : contactez moi

    Ce flim n'est pas un flim sur le cyclimse. Merci de votre compréhension.[/SIZE]

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 114
    Points : 57
    Points
    57
    Par défaut
    Tu pourrais donc essayer un "System.gc()" quelque part dans ton code et voire si ca améliore les choses.
    J'en ai déjà mis à différents endroits, sans succès...

    Que veux tu dire par là exactement ???
    Je veux dire par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Lala{
        final static int LALA = 5;
     
        Lala(){}
    }
    Je n'ai pas d'autres variables statiques que des variables comme celle-ci (et avec le final).

    S'il n'est pas trop long, cela pourrait être intéressant de voir certaines parties du code
    voilà une partie qui je pense pourrait être en cause, c'est une méthode qui insère un arbre représentant une liste de n-grammes dans un fichier contenant une liste de n-grammes, de façon à ce que la liste reste ordonnée (NGTN = n-gram tree node) :
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    	public static void insert(NGTN root1, String ngramFile, String tmpFolder, int n) {
    		//ngramFile is binary
     
    		//Algorithm:
    		//load as many groups of ngrams as possible from ngramFile -> root2
    		//insert the new ones (root1) in the old ones (root2)
    		//append that in a temporary file
    		//continue to browse the ngram file
     
    		//k: number of lines   (77 bytes: size of one NGTN)
    		//X: buffer size
     
    		int k = (int) (50 * 1024 * 1024 / (77 * n * 3));
    		int lineSize = (n + 1) * 4;
    		int X = k * lineSize;
     
    		String tmpFile = generateFileName(tmpFolder);
     
    		try {
    			FileInputStream fis = new FileInputStream(ngramFile);
    			BufferedInputStream bis = new BufferedInputStream(fis, X);
     
    			//index: tells at which node in root1 we are
    			int index = 0;
     
    			boolean lastLoop = false;
    			while(!lastLoop){
    				System.gc();
    				lastLoop = (bis.available() < X);
    				bis.mark(X);
    				byte[] b = new byte[X];
    				int readBytes = bis.read(b);
    				bis.reset();
     
    				//root1: the new tree to be inserted
    				//root2: old subtrees
    				NGTN root2;
     
    				//if readBytes <= 0 ---> empty file
    				if (readBytes > 0){
    					//wrap bytes into a ByteBuffer
    					ByteBuffer bb = ByteBuffer.wrap(b, 0, readBytes);
     
    					//get the corresponding subtree
    					root2 = loadNGrams(bb, n, lastLoop);
    				}
    				else root2 = new NGTN();
     
    				int loaded = root2.getLeafCount();
    				bis.skip(loaded * lineSize);
     
    				//put "young" nodes into the "old" subtree
    				index = putFromIndex(root1, index, root2, lastLoop);
     
    				//append the subtree to the temporary file
    				append(root2, n, tmpFile);
    			}
     
    			bis.close();
    			fis.close();
     
    			//replace ngramFile with tmpFile
    			replace(ngramFile, tmpFile);
    			remove(tmpFile);
     
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}

Discussions similaires

  1. Réponses: 17
    Dernier message: 02/02/2006, 12h03
  2. gestion de la mémoire
    Par moldavi dans le forum C++
    Réponses: 17
    Dernier message: 04/02/2005, 23h18
  3. Réponses: 11
    Dernier message: 26/12/2004, 22h50
  4. Gestion de la mémoire entre plusieurs DLL
    Par Laurent Gomila dans le forum C++
    Réponses: 7
    Dernier message: 27/07/2004, 15h28
  5. Gestion des variables - mémoire ?
    Par RIVOLLET dans le forum Langage
    Réponses: 4
    Dernier message: 26/10/2002, 12h44

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