Bonjour.
Tout est dans le titre. :)
Comment mesurer la taille d'un objet non serializable?
Version imprimable
Bonjour.
Tout est dans le titre. :)
Comment mesurer la taille d'un objet non serializable?
Je ne comprends pas, c'est pour quoi faire ?
J'ai juste besoin de connaitre la taille d'un objet. Une httpSession en l'occurence, qui contient des objets non serializables.
ce n'est pas possible. De toutes facons, la some des objets présents dans un httpsession ne réprésente pas nécessairement sa taille spécifique. Certains objets peuvant aussi être référencés ailleurs (et c'est souvent le cas). Exemple: tu stocke une session hibernate dans une httpsession, celle-ci référence la config hibernate, la factory et tous les proxy, mais cette masse importante de donnée apparitent logiquement à hibernate, pas à la session http.
Quand tu dis que ce n'est pas possible, je suis un peu sceptique.
Le serveur d'application doit bien allouer une taille pour gérer les sessions (même si celles-ci ne sont pas serializables).
Il n'y a pas un outil qui permette d'évaluer ça? Moins lourd que faire un dump de la mémoire, ou un truc du genre...
Non, comme n'importe quel objet java, c'est la jvm qui se charge de l'allocation au besoin, c'est elle qui gère sa tambouille. En ce qui concerne le serveur d'application, pour lui une session se résume en gros à une Hashmap. Quand la session est détruite, il se contente de déréférencer la hashmap et d'appeler les éventuels listener dedans, c'est le garbage collector qui fait le reste du travail.
Que ce soit sa tambouille, j'en ai bien conscience.
En l'occurence la JVM est bien obligée d'allouer une place mémoire a cet objet (qu'il soit serializable ou non) et il y'a forcément un moyen de la mesurer (quitte à faire un dump de la mémoire).
Non, elle n'alloue pas une place mémoire à cet objet, il peut y avoir plusieurs place mémoires alloués à l'objet. Si tu te concentre uniquement sur l'objet, je dirais que tu dois pouvoir trouver dans les spécifications de la jvm comment calculer la taille de l'objet en fonction de la définition de ses champs. Le problème principal, c'est de définir ce que tu entends pas la taille de l'objet. Exemple
Qu'est-ce que c'est pour toi, la taille de Machin? Est que c'est la référence this+la référence à sa classe+la référence à Truc plus la référence à String+la référence à tableau? Auquel cas ce serait grosso modo 4 fois 64bits (je pense). Ou est-ce qu'il faut inclure la taille de la string, de truc et de tableau? Auquel cas il faut y aller récursivement? Mais dans ce cas là, à quel niveau s'arrête? En allant récursivement, on va mesurer la taille d'une grosse partie de la JVM, qui n'a rien à voir avec la "taille de la session" (qui reste d'ailleurs un concept à définir).Code:
1
2
3
4
5
6
7 public class Machin { private Truc truc; private String string; private long[] tableau; //.... }
Des outils de dump mémoire liés au débuggage sont capable de te mesurer la taille intrinsèque d'un objet, mais ça ne t'es aucune utilité, car, comme je l'ai dit, la tailel intrinsèque est la même pour toutes les instances d'une classe donnée, et ce n'est probablement pas ce que tu cherche.
Si tu peut en créer, tu peut mesurer l'usage mémoire avant et après, mais ça risque d'être approximatif. Réessaye plusieurs fois pour voir si la méthode marche à peu près.