8
votes

Ligne directrice de la mémoire Java

probablement une question stupide mais ..

Y a-t-il de bonnes lignes directrices pour la quantité de structures de données Java de base de la mémoire?

C'est-à-dire: combien de mémoire sera consommée par un simple pojo avec un membre INT et un membre string (indique qu'il contient une chaîne de caractères de 10 caractères)? Quelle quantité de mémoire serait consommée par une liste de 10 desdits objets?

etc


1 commentaires

Il y a des questions stupides posées sur donc, mais le vôtre n'est pas l'un d'entre eux. :-)


4 Réponses :



0
votes

Je dirais 144 bits pour la chaîne (32 pour le pointeur, 80 pour les 10 caractères, 32 pour la longueur int), 32 bits pour l'int, et 32 ​​pour le pointeur à l'objet, faisant 208 bits. Une liste de 10 aurait besoin de 2080 bits pour les objets et les pointeurs, un supplément de 32 * 2 * 10 pour les pointeurs suivants et précédents, 32 pour la longueur de la liste et 32 ​​pour le pointeur. Cela fait du total 2784 bits. Et dans mon expérience avec Java vs ce que je pense que cela nécessitera (aka c), vous appliquez une fois deux multiplicateurs, ce qui en fait 5568 bits.

En fin de journée si vous êtes inquiet des exigences de la mémoire, testez-la et voyez! Mais il est assez difficile de tester pour de tels petits nombres ... Essayez quelques milliers d'entre eux à la place.


4 commentaires

Sur un point d'arrivée de 64 bits VM peut être 64 bits - et 10 caractères sont de 160 bits, puisqu'un Java Char est un type de 16 bits (qui explique probablement votre expérience par rapport à c).


Bons points tous les deux :) Les principaux domaines que j'ai raccordés Java sont dans des structures de données, où il utilisait entier au lieu d'Int que je deviné était là où le X2 est venu de l'affaire.


Michael: Il n'est toutefois pas mandaté par la spécification VM, que les chaînes sont conservées UTF16-codées en mémoire. Optimisation de l'empreinte mémoire au lieu d'une efficacité d'exécution, une mise en œuvre de chaîne peut aussi bien conserver les données de caractères UTF8-codées en interne ou utiliser tout autre codage.


Eh bien, l'API DOC dit "Une chaîne représente une chaîne dans le format UTF-16". Et tout en éventuellement satisfaire à l'API tout en utilisant UTF-8 en interne, les effets sur l'efficacité de l'exécution seraient assez horribles (beaucoup de méthodes O (1) deviennent soudainement).



0
votes

Gary Sevitsky de IBM Recherche a écrit plusieurs papiers sur l'analyse et le contrôle de la mémoire de la mémoire dans les programmes Java. La moitié plus récente de Sa liste de publication semble pertinent pour votre demande.

J'ai assisté à Un didacticiel de son à Oopsla 2008 sur cette sujet et trouvé une bonne introduction à cet aspect effrayant, principalement évité de Java.


0 commentaires

1
votes

Les chaînes sont notoirement difficiles, car elles portent sur un tableau de caractères sous lequel est partagé avec d'autres objets à chaîne qui sont des substrings d'un objet de chaîne d'origine.


0 commentaires