Je voudrais poser des questions à propos de surcharge de mémoire en java, J'ai une grande ArrayList (61,770 éléments), et en essayant de calculer la quantité de mémoire prise par chaque élément (en comptant l'objet et son entrée ArrayList), En profilant l'application, j'obtiens qu'après que toutes les données ont été chargées, le tas prend ~ 25Mb. lorsque l'ArrayList a seulement 2 éléments le tas prend ~ 1Mb, donc à peu près:Dépense de mémoire Java
(24 * 1024 * 1024)/61,768 = 407 octets.
cependant, quand je compte les champs de chaque objet, je reçois 148 octets (non compris le ArrayList, et à supposer que int = 4, float = 4, référence = 4), je suis curieux de savoir où a fait tous ces octets supplémentaires viennent de ...
Je peux deviner que puisque les objets que je stocke dans ArrayList implémentent une interface, ils stockent des valeurs supplémentaires, peut-être que la VM stocke un pointeur de fonction de 4 octets pour chaque méthode implémentée? l'interface qu'ils implémentent a 20 fonctions donc 80 octets de plus, totalisant 228 octets, toujours pas près des 400 octets mesurés.
toute aide serait appréciée.
wow, merci pour toutes les bonnes réponses.
@Bolo: merci pour le lien, avec cette classe je mesure ~ 350 octets par objet donc je peux au moins confirmer la source de la grande utilisation de la mémoire.
@Yuval A: merci pour cette présentation, une précieuse source d'information.
@Ukko: point noté.
@Jayan: maintenant NetBeans profiler me donne des erreurs lorsque j'essaie de vider le tas, réessayera plus tard.
Cet article peut vous être utile: http://www.javaworld.com/javaworld/javatips/jw-javatip130.html – Bolo
Si vous démarrez avec une nouvelle ArrayList (61770) à la place, par exemple, d'une nouvelle ArrayList () et laissez-le ensuite redimensionner automatiquement, vous obtiendrez également un surcoût différent. Avez-vous défini la taille correcte avant de vérifier l'utilisation de la mémoire? – extraneon
@flamealpha: 61 770 n'est pas grand :) J'ai HashMap si grand qu'ils mettent la plupart des systèmes à genoux ... C'est pourquoi je les ai remplacés par * TIntIntHashMap * de Trove qui sont juste * * beaucoup plus de mémoire/rapidité efficace :) Hélas, cela ne fonctionne qu'avec les primitives: -/ –
SyntaxT3rr0r