Bonjour,
J'aimerais savoir s'il existe un moyen de connaitre l'espace mémoire occupé par un objet afin d'estimer les ressouces nécessaires à l'éxécution de mon application.
Bonjour,
J'aimerais savoir s'il existe un moyen de connaitre l'espace mémoire occupé par un objet afin d'estimer les ressouces nécessaires à l'éxécution de mon application.
Difficile à dire, Java ne disposant pas de l'opérateur sizeof. Je dirais qu'il est d'au moins l'espace mémoire nécessaire pour y stocker les attributs de l'objet (à raison de 8 octets pour un long ou un double, 4 pour un int ou un float, ..., 4 octets par référence.)
Mon problème est que mon objet est un bean relativement complexe avec ArrayList d'objets, string... tout est variable.
Mon projet étant une application web tournant sur un serveur, j'aurai aimé savoir à aprtir de combien d'utilisateurs je risque de saturer la mémoire de mon serveur. Mais j'ai bien peur que ce soit impossible à dire sans mettre en place des tests untiaires qui simulent plusieurs clients.
Désolé je nettoe pas j'ai pas trop le temps mais moi je fais ça pour ce genre de problème (il y a surement plus propre mais ça me suffit) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 private int getObjectSize(Object obj) { if(obj == null) return 0; byte abyte0[]; try{ ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream(); ObjectOutputStream objectoutputstream = new ObjectOutputStream(bytearrayoutputstream); objectoutputstream.writeObject(obj); abyte0 = bytearrayoutputstream.toByteArray(); return abyte0.length; }catch (Exception exception){ return 0; } }
Excusez moi de la lenteur de la réponse mais je me suis posé quelques questions relatives à la réponse de gailuris.
Pour que ta méthode fonctionne, cela implique que mon objet soit serialisable ce qui n'était pas le cas à l'origine.
Je me suis alors demandé quel est l'impact (mémoire, temps d'exécution) de rendre un objet sérialisable. Je n'ai pas vraiment trouvé de réponse claire à ma question :
Si le fait qu'un objet soit sérialisable n'a d'impact qu'au moment de la sérialisation alors pourquoi faut-il préciser explicitement que l'objet est sérialisable (en d'autre termes : pourquoi tout objet n'est pas sérialisable) ?
Je sais que je dérive un peu par rapport au sujet de base...
En tout cas, ta méthode donne effectivement une solution pour obtenir la taille d'un objet des propriétés qu'il référence.
oui (j'aurai pu le préciserEnvoyé par devtele
)
Je crois qu'il y a un impact seulement lors de la sérialisation (à vérifier) et il faut préciser explicitement que l'objet est serializable pour des questions de sécurités (enfin il me sembleEnvoyé par devtele
)
http://java.sun.com/j2se/1.5.0/docs/api/java/io/Serializable.html
Lis le dernier paragraphe.
Les classes qui implémentent sérialisable doivent posséder un serialVersionUID pour la vitesse et pour éviter des erreures. Une classe qui n'a pas besoin d'être sauvée n'a pas besoin de cet identifiant, et, n'a donc pas besoin de cette interface. Toutes les classes ne sont donc pas serializables.
De plus, même si une classe serialisable était identique en tous points à une classe qui ne le serait pas, ça me parait bien de lui "coller" une interface afin de l'identifier et au cas ou les prochaines versions de java aient besoin de spécifier des trucs dans cette interface. Ca me semble plus "propre" ainsi.
Je suis aussi curieux de savoir quelle taille prend une classe en java et plus généralement comment (en gros) la JVM gère la mémoire.
Partager