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 :

[JVM]Gestion mémoire : Bizarre


Sujet :

Java

  1. #1
    Expert éminent
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 985
    Points : 6 566
    Points
    6 566
    Par défaut [JVM]Gestion mémoire : Bizarre
    Bonjour,

    J'ai le code suivant :

    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
     
    // - Record 100 date
    			for (int l = 0; l < 10; l++) {
    				System.out.println("Evolution=" + l);
    				System.out.println("Memory before = "
    						+ Runtime.getRuntime().totalMemory());
     
    				calendar.set(2005, month++, 1, 0, 0, 0);
    				d0 = calendar.getTime();
     
    				// - Création d'un tableau 3D de double
    				double tmp0[][][] = new double[ni][nj][nk];
     
    				for (int k = 0; k < nk; k++) {
    					for (int j = 0; j < nj; j++) {
    						for (int i = 0; i < ni; i++) {
    							tmp0[j][i][k] = 5 * k + Math.random() * 2;
    						}
    					}
    				}
    				System.out.println("Memory after = "
    						+ Runtime.getRuntime().totalMemory());
    				// - Création du BDouble3D
    				BDouble3D bd3d0 = new BDouble3D(tmp0);
     
    				pressure.put(new Double(d0.getTime() / 1000), bd3d0);
    				System.out.println("Memory after = "
    						+ Runtime.getRuntime().totalMemory());
     
    			}
    Qui me donne en sortie :

    Evolution=0
    Memory before = 90095616
    Memory after = 159727616
    Memory after = 159727616
    Evolution=1
    Memory before = 159727616
    Memory after = 282619904
    Memory after = 282619904
    Evolution=2
    Memory before = 282619904
    Memory after = 282619904
    Memory after = 282619904
    Evolution=3
    Memory before = 282619904
    Memory after = 499564544
    Memory after = 499564544
    Evolution=4
    Memory before = 499564544
    Memory after = 499564544
    Memory after = 499564544
    Evolution=5
    Memory before = 499564544
    Memory after = 499564544
    Memory after = 499564544
    Evolution=6
    Memory before = 499564544
    Memory after = 881041408
    Memory after = 881041408
    Evolution=7
    Memory before = 881041408
    Memory after = 881041408
    Memory after = 881041408
    Evolution=8
    Memory before = 881041408
    Memory after = 881041408
    Memory after = 881041408
    Evolution=9
    Memory before = 881041408
    Memory after = 881041408
    Memory after = 881041408
    Populate optim : done!
    Memory after = 881041408
    Si l'on considère la ligne suivante qui corespond normalement à la taille de ma matrice:

    Evolution=0
    Memory before = 90095616
    Memory after = 159727616
    J'ai donc une matrice égale à 159727616 - 90095616 = 69632000 bytes, soit 69632000 / 1024 = 68000 Moctets

    sachant que ma matrice fait 8 000 000 de cellules double , je devrais avoir ( 8 000 000 * 8 octets ) / 1024 = 62500 Mo , pour quoi cette différence ?

    De plus il y a des traces comme :
    Evolution=7
    Memory before = 881041408
    Memory after = 881041408
    Memory after = 881041408
    Pourquoi entre before et after il n'y a pas de différence alors qu'une matrice de 8 000 000 de cellules doubles vient d'être créée ? La mémoire se vide t'elle au même moment ?

    Merci d'avance pour vos éclaircissements

  2. #2
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Facile, tes traces sont fausses. totalMemory() donne la taille memoire totale allouee par la VM dans l'environnement d'execution et non la memoire vraiment utilisee. Essaye de faire totalMemory() - freeMemory() pour avoir la memoire vraiment utilisee. Ta seconde question s'explique donc ainsi : la JVM a assez de memoire allouee, ou ne peux plus en allouer plus, pour faire le calcul.

    N'oublie pas en outre qu'un tableau contient egalement un entier (4 octets) pour sa longueur. Puisque tu as un tableau de tableaux de tableaux, tu dois prendre en compte 4 octets de plus par tableau (par exemple pour une matrice [200][200][200], ca fait un paquet de tableaux
    Romain Guy
    Android - Mon livre - Mon blog

  3. #3
    Expert éminent
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 985
    Points : 6 566
    Points
    6 566
    Par défaut
    Génial, merci bcp pour ces renseignements !!!

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

Discussions similaires

  1. Bug JVM - gestion des sockets
    Par boby62423 dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 18/02/2010, 09h26
  2. JVM Probleme gestion mémoire
    Par quiquekoi dans le forum Langage
    Réponses: 17
    Dernier message: 18/12/2008, 09h14
  3. Gestion de la memoire : JVM et windows
    Par biozaxx dans le forum Langage
    Réponses: 8
    Dernier message: 19/02/2008, 17h10
  4. [JVM]Gestion de la mémoire
    Par Crypt dans le forum Général Java
    Réponses: 20
    Dernier message: 31/12/2005, 14h33
  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