Question

Je voudrais poser des questions sur la mémoire Overhead en java, J'ai une grande liste de tableaux (61,770 objets), et d'essayer de calculer la quantité de mémoire utilisée par chaque élément (en comptant l'objet et son entrée ArrayList), en établissant le profil de l'application que je reçois après toutes les données sont chargées, le tas prend ~ 25Mo. lorsque le ArrayList a seulement 2 articles le tas prend ~ 1Mb, donc à peu près:

(24 * 1024 * 1024) / 61768 = 407 octets.

mais , 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 provient ...

je peux deviner que, puisque les objets que je conserver dans l'ArrayList mettent en œuvre une interface, ils stockent des valeurs supplémentaires, peut-être les magasins VM un pointeur de fonction 4byte pour chaque procédé mis en oeuvre? l'interface qu'ils ont à mettre en œuvre 20 fonctions de sorte que soit 80 plus d'octets, soit un total de 228 octets, pas encore près de 400 octets mesurés.

toute aide serait appréciée.


wow, merci pour toutes les grandes réponses.

@Bolo. Merci pour le lien, avec cette classe i mesure ~ 350 octets par objet afin que je puisse moins confirmer la source de la grande utilisation de la mémoire

@Yuval A: merci pour cette présentation, une source d'information précieuse

.

@Ukko:. Point noté

@Jayan. En ce moment profileur NetBeans me donne des erreurs lorsque je tente de vider le tas, va essayer à nouveau plus tard

Était-ce utile?

La solution

Ces résultats ne sont pas surprenants. La machine virtuelle Java ajoute des quantités énormes de frais généraux à chaque objet.

A propos du double de la taille attendue pour un seul objet, en raison de JVM surcharge de la mémoire, n'est pas rare.

Cette présentation a une merveilleux, en profondeur, explication et aperçu des différentes utilisation de la mémoire de structure de données en Java.

Autres conseils

Un ArrayList ist surtout plus grand que le nombre d'éléments. Utilisez getCapacity() pour obtenir la taille actuelle du tableau sous-jacent.

Un gros problème avec votre approche est l'interaction avec le garbage collector. Il est essentiellement un test que vous avez proposé totalement opaque de l'extérieur.

Comme une expérience de pensée si vous voulez faire cela, vous devez

  1. feu de votre machine virtuelle Java et faire quelques GCS mondiaux pour obtenir toutes les jonque
  2. Mesurer la taille du tas et la notion de Java de la façon dont d'espace libre dont il dispose.
  3. Lancez votre test
  4. GC deux ou trois fois
  5. Refaire les mesures de l'étape # 2

Après tout cela et un peu de mathématiques, vous serez plus proche, mais toujours pas droit. La seule vraie solution est de demander effectivement la mise en œuvre comme les autres l'ont mentionné. Ou la figure hors de la connaissance de la mise en œuvre.

Mémoire consommée par arraylist est un peu vague.

Prenez une décharge de tas du processus au stade approprié - après que les valeurs sont entièrement affectées. Ensuite, utiliser des outils comme analyseur de la mémoire (éclipse).

Vous remplissez peu profonde et trouver RÉPARTIS tas tailles.

Comme une note de côté, puisque vous savez exactement combien d'objets seront dans votre ArrayList, pourquoi ne pas simplement utiliser un tableau []? Est-ce que le nombre d'objets là-dedans changement?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top