Je vais essayer d'expliquer le nombre référencé dans la source de l'article.
L'article décrit les métadonnées de l'objet généralement composé de: classe, des drapeaux et de la serrure.
La classe et de verrouillage sont stockées dans l'objet de l'en-tête et de prendre de 8 octets sur 32 bits VM. Je n'ai pas trouvé que toute l'information à propos de la JVM des implémentations qui a des drapeaux de l'info dans l'en-tête objet. C'est peut-être alors que c'est stockée quelque part à l'extérieur (par exemple par le garbage collector pour compter les références à l'objet, etc.).
Supposons donc que l'article parle de quelques x32 AbstractJVM qui utilise 12 octets de mémoire pour stocker des méta-informations sur l'objet.
Alors pour char[]
nous avons:
- 12 octets de méta-informations (8 octets sur x32 JDK 6, 16 octets sur x64 JDK)
- 4 octets pour la taille du tableau
- 2 octets pour chaque caractère stocké
- 2 octets de l'alignement si les caractères nombre est impair (x64 JDK:
2 * (4 - (length + 2) % 4)
)
Pour java.lang.String
nous avons:
- 12 octets de méta-informations (8 octets sur x32 JDK6, 16 octets sur x64 JDK6)
- 16 octets pour les champs de type Chaîne (il en est ainsi pour JDK6, de 8 octets pour JDK7)
- la mémoire nécessaire pour stocker char[] comme décrit ci-dessus
Donc, nous allons compter la quantité de mémoire nécessaire pour stocker "MyString"
comme String
objet:
12 + 16 + (12 + 4 + 2 * "MyString".length + 2 * ("MyString".length % 2)) = 60 bytes.
De l'autre côté, nous savons que pour stocker uniquement les données (sans information sur le type de données, la longueur ou quoi que ce soit d'autre) nous avons besoin de:
2 * "MyString".length = 16 bytes
La surcharge est - 60 / 16 = 3.75
De même pour le caractère unique de la matrice de nous obtenir le maximum de frais généraux':
12 + 16 + (12 + 4 + 2 * "a".length + 2 * ("a".length % 2)) = 48 bytes
2 * "a".length = 2 bytes
48 / 2 = 24
La suite de l'article des auteurs de la logique en fin de compte le montant maximal des frais généraux de la valeur de l'infini est réalisée lorsque l'on stocker une chaîne vide :).