Quelle est la consommation de la mémoire d'un objet en Java?
Est l'espace de la mémoire consommée par un objet avec 100 attribue le même que celui de 100 objets, avec un attribut de chaque?
La quantité de mémoire allouée pour un objet?
De combien d'espace supplémentaire est utilisé lors de l'ajout d'un attribut?
Vous devez vous connecter pour publier un commentaire.
Mindprod souligne que ce n'est pas une question simple à répondre:
Méthodes de mesure
Vous pouvez utiliser
Instrumentation.getObjectSize()
pour obtenir une estimation de stockage consommé par un objet.De visualiser l' réelle disposition de l'objet, de la taille et de références, vous pouvez utiliser le JOL (Java Disposition de l'Objet) de l'outil.
Objet des en-têtes et les références de l'Objet
Dans un cadre moderne 64-bit JDK, un objet a un 12-octets d'en-tête, rembourré, à un multiple de 8 octets, de sorte que la taille minimale des objets est de 16 octets. Pour 32-bit Jvm, la surcharge est de 8 octets, collier pour un multiple de 4 octets. (À partir de Dmitry Spikhalskiy réponse, Jayen réponse, et JavaWorld.)
Généralement, les références sont de 4 octets sur les plates-formes 32 bits ou sur les plateformes 64 bits jusqu'à
-Xmx32G
; et de 8 octets au-dessus de 32 go (-Xmx32G
). (Voir comprimé références de l'objet.)Comme un résultat, une JVM 64 bits nécessitent habituellement de 30 à 50% plus d'espace de tas. (Dois-je utiliser un 32 ou un 64 bits JVM?, 2012, JDK 1.7)
Coffret types, les tableaux et les chaînes de
Boîte wrappers ont une surcharge par rapport à des types primitifs (à partir de JavaWorld):
Autres conteneurs sont trop coûteux:
Alignement
Considérer cette exemple d'objet:
D'un naïf somme suggère qu'une instance de
X
utiliserait 17 octets. Toutefois, en raison de l'alignement (également appelé de remplissage), la JVM alloue de la mémoire, en multiple de 8 octets, donc au lieu de 17 octets qu'il serait d'allouer 24 octets.Cela dépend de l'architecture/jdk. Pour un moderne JDK et 64 bits de l'architecture, un objet a de 12 octets d'en-tête et le rembourrage de 8 octets - si taille minimale des objets est de 16 octets. Vous pouvez utiliser un outil appelé Java Disposition De L'Objet pour déterminer une taille et d'obtenir des détails au sujet de l'objet de mise en page et la structure interne d'une entité ou d'suppose que cette information par catégorie de référence. Exemple de sortie pour Entier sur mon environnement:
Donc, pour Entier, la taille de l'instance est de 16 octets, parce que 4 octets int compacté en place juste après l'en-tête et avant de rembourrage limite.
Exemple de Code:
Si vous utilisez maven, pour obtenir JOL:
Chaque objet a une certaine surcharge pour ses associés de surveiller et d'informations de type, ainsi que les champs eux-mêmes. Au-delà, les champs peuvent être énoncés assez bien cependant la JVM voit ajustement (je crois) - mais comme montré dans une autre réponse, au moins certains Jvm pack assez étroitement. Considérons une classe comme ceci:
vs
Sur une JVM 32 bits, je m'attends à 100 instances de
SingleByte
de prendre 1200 octets (8 octets de surcharge + 4 octets pour le champ en raison de rembourrage/alignement). Je m'attends à une instance deOneHundredBytes
de prendre 108 octets - les frais généraux, et de 100 octets, paniers. Il peut certainement varier en fonction de la JVM si - une mise en œuvre peut décider de ne pas emballer les champs deOneHundredBytes
, conduisant à la prise de 408 octets (= 8 octets + 4 * 100 aligné rembourré en octets). Sur une JVM 64 bits la surcharge pourrait bien être plus grand aussi (pas sûr).EDIT: Voir le commentaire ci-dessous; apparemment HotSpot plaquettes de 8 limites d'octets au lieu de 32, de sorte que chaque instance de
SingleByte
prendrait 16 octets.De toute façon, le "seul objet" sera au moins aussi efficace que de multiples petits objets - pour les cas simples comme ça.
Non, l'inscription d'un objet prend un peu de mémoire aussi. 100 objets avec 1 attribut prendra plus de mémoire.
Il semble que chaque objet a une surcharge de 16 octets sur les systèmes 32 bits (et de 24 octets sur les systèmes 64 bits).
http://algs4.cs.princeton.edu/14analysis/ est une bonne source d'information. Un exemple parmi de nombreux bons est la suivante.
http://www.cs.virginia.edu/kim/publicity/pldi09tutorials/memory-efficient-java-tutorial.pdf est également très instructif, par exemple:
Pas.
Au total /libres de la mémoire d'un programme peuvent être obtenus dans le programme via
L'exécution a plusieurs méthode qui se rapporte à la mémoire. Le codage suivant l'exemple de démontrer son utilisation.
J'ai eu de très bons résultats à partir de la java.lang.de l'instrument.Instrumentation approche mentionné dans une autre réponse. De bons exemples de son utilisation, voir l'entrée, Instrumentation Compteur De Mémoire de la JavaSpecialists Bulletin d'information et le java.sizeOf de la bibliothèque sur le site de SourceForge.
La question sera très large.
Cela dépend de la variable de classe ou vous pouvez l'appeler comme les états de l'utilisation de la mémoire en java.
Il a aussi quelques exigence de mémoire supplémentaire pour les en-têtes et le référencement.
Le segment de mémoire utilisée par un objet Java comprend
de la mémoire pour des primitifs champs, en fonction de leur taille (voir ci-dessous pour les Tailles de types primitifs);
de la mémoire pour les champs de référence (4 octets);
un objet en-tête, composé de quelques octets de "ménage" de l'information;
Objets en java nécessite également de "ménage" de l'information, telles que l'enregistrement d'un objet de la classe, de l'identité et le statut des indicateurs tels que si l'objet est joignable, actuellement à la synchronisation verrouillé etc.
Objet Java-tête de taille varie sur 32 bits et 64 bits de la jvm.
Bien que ces sont les principaux consommateurs de mémoire de la jvm exige également d'autres domaines, parfois, comme pour l'alignement du code de l'e.t.c.
Tailles de types primitifs
boolean & byte -- 1
char & court -- 2
int & float -- 4
long & double -- 8
Dans le cas où c'est utile à quelqu'un, vous pouvez le télécharger à partir de mon site web un petit Java agent pour l'interrogation de l'utilisation de la mémoire d'un objet. Il va vous permettre de requête "profond" à l'utilisation de la mémoire ainsi.
(String, Integer)
Goyave Cache utilise, par élément. Merci!non, 100 petits objets a besoin de plus d'informations (de mémoire) que dans une grande.
Les règles au sujet de combien de mémoire est consommée dépend de la JVM de la mise en œuvre et de l'architecture du PROCESSEUR (32 bits et 64 bits par exemple).
Pour les règles détaillées pour la JVM de SUN vérifier mon ancien blog
Ce qui concerne,
Markus