Bonjour, bonsoir
Je suis dans une phase de tests, et j'aimerai pouvoir récuperer la taille mémoire utilisée par mon programme java à un moment X. Tout ça en java bien entendu.
Merci d'avance pour vos réponses
Bonjour, bonsoir
Je suis dans une phase de tests, et j'aimerai pouvoir récuperer la taille mémoire utilisée par mon programme java à un moment X. Tout ça en java bien entendu.
Merci d'avance pour vos réponses
Dans la classe java.lang.Runtime, tu dispose de quelques fonctions sur la mémoire ... regarde si tu y trouve ton bonheur
J'avais deja essayé, mais ca me sort des chiffres incohérents.
Incohérent dans quel style?Envoyé par splend_f
Mémoire max est correcte je lance mon appli avec 256Mo (-Xmx256M)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Mémoire totale : 7.016448Mo. Mémoire disponible : 1.730832Mo. ( Mémoire maximum utilisable : 266.40384Mo.
Mais à l'instant où ces données sont collectées mon n'appli utilise 118Mo de mémoire (Je sais ça via un top sur mon terminal).
Donc pour moi la mémoire disponible correspondrait à genre 256 - 118 ou un truc dans le genre.
j'affiche mes données de la manière suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 System.out.print("Mémoire totale : "); System.out.print(Runtime.getRuntime().totalMemory() / 1000000d); System.out.println("Mo."); System.out.print("Mémoire disponible : "); System.out.print(Runtime.getRuntime().freeMemory() / 1000000d); System.out.println("Mo."); System.out.print("Mémoire maximum utilisable : "); System.out.print(Runtime.getRuntime().maxMemory() / 1000000d); System.out.println("Mo.");
euu .. si tu commençait par valuer ta mémoire en puissance de 2, ça serait mieux nan ? (C pas ça le problème, mais ça serait 1 bon début ...) :et puis 118Mo pr 1 appli, C vraiment ... beaucoup .. pour pas dire énorme.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 System.out.print("Mémoire totale : "); System.out.print(Runtime.getRuntime().totalMemory() / (1024*1024)d); System.out.println("Mo."); System.out.print("Mémoire disponible : "); System.out.print(Runtime.getRuntime().freeMemory() / (1024*1024)d); System.out.println("Mo."); System.out.print("Mémoire maximum utilisable : "); System.out.print(Runtime.getRuntime().maxMemory() / (1024*1024)d); System.out.println("Mo.");
Enorme c'est normal je fais des traitements sur des bases monstreuses. Plus de 10 000 000 d'attributs. Et encore le code est ultra optimisé
Je sais bien, ct juste pour donner un ordre d'idée et montrer que ça ne pouvait correspondre aux résultats souhaitésEnvoyé par NeptuS
mmm ... optimisé dis-tu ... et tu charges ta base en mémoire ? ... moi je n'appelle pas ça de l'optimisation ^^.
à moins que j'ai mal compris ...
Bha disons que l'on est obligé de conserver certains paramètres pour faire des calculs de supports. Et forcement c'est très couteux en mémoire, mais là on n'a pas le choix
Apparemment, il y aurait quelques petites "incohérences" entre les valeur donnés par le Runtime Java, et par top. Voir ce lien pour de plus amples infos: http://www.jguru.com/faq/view.jsp?EID=478232
mouai ... 10.10^6 paramètes en mémoire ... C trop ... même pour des calculs .. alors soit tu les stocke sur disque (ficher) et dans ce cas je dis ok : les accès disques sont très lents et ça peut valoir le coup, ou alors ils sont bien gentiement à leur place dans 1 BD et là je dis que t'as joué au con : les sgbd sont tellements puissants aujourd'hui qu'on a plus intérêt à se fier à eux qu'à ses propres algos.
Si c'était possible. Je vais t'éclairer sur le sujet, par un exemple ça sera plus simple.
ex:
Carrefour a besoin de connaitre quels sont les articles (ensemble d'articles) qui sont régulièrement achetés ensemble. Pour cela ils te fournissent l'ensemble des tickets d'un de leur magasin sur une année (déjà imagine la taille des données). Après il faut rechercher les ensembles d'articles en fonction d'un support donné (un pourcentage), par ex tous les articles qui figurent dans au moins 0.01% des caddies. Et plus tu descends ce support plus tu obtiens des données énormes à traiter et plus ça met du temps. Car si carrouf veut ses données sur l'année 2005, faut pas lui fournir les résultats en 2008.
Maintenant, si tu connais un sgbd capable de faire ça...
Donc si tu veux approfondir le sujet, tu peux regarder ici :
http://himalaya-tools.sourceforge.net/Mafia/
Salut,
L'optimisation peut prendre des formes totalement différentes selon tes besoins...Envoyé par NeptuS
- Tu peux optimiser la mémoire utilisée, en ne conservant que le strict minimum...
- Tu peux optimiser les temps d'exécutions, en créant des caches qui éviteront de faire des acces aux données à chaque fois...
Il n'y a pas une bonne et une mauvaise solution : cela dépend de ton application et de tes besoins...
Si optimiser la consommation mémoire nuit au performance ce n'est pas forcément une bonne solution... Pour moi 256Mo de mémoire ce n'est pas grand chose pour une machine serveur ou un calculateur... Maintenant c'est vrai que pour une application cliente cela commence à faire beaucoup...
Pour en revenir au problème initial, si tu es sous Java 5.0 tu peux regarder du coté de l'API de Management et à la classe MemoryMXBean :
a++
Code : Sélectionner tout - Visualiser dans une fenêtre à part MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
J'avais oublié de dire merci
Ca marche niquel les MemoryMXBean. Merci encore (et honte à moi )
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager