Wenn man die Frage wörtlich nimmt, nehmen auf den meisten JVMs alle Referenzen auf 32-Bit-JVMs 4 Bytes, eine 64-Bit-JVMs, eine Referenz dauert 8 Bytes, wenn nicht -XX: + UseCompressedOops verwendet wurde -Bytes.
Ich nehme an, Sie fragen sich, wie Sie angeben, wie viel Platz ein Objekt einnimmt. Sie können Instrumentation (keine einfache Sache) verwenden, aber dies wird Ihnen nur eine geringe Tiefe geben. Java neigt dazu, in viele Objekte einzubrechen. Etwas, das C ++ ist, könnte eine einzelne Struktur sein, daher ist es nicht so nützlich.
Wenn Sie jedoch ein Speicherproblem haben, empfehle ich Ihnen einen Speicherprofiler. Dies wird Ihnen die seichten und tiefen Raumobjekte geben und Ihnen ein Bild über das ganze System geben. Dies ist oft sinnvoller, da Sie mit den größten Verbrauchern beginnen und diese optimieren können, selbst wenn Sie Java seit zehn Jahren entwickeln. Sie werden nur raten, wo Sie am besten optimieren sollten, wenn Sie keine harten Daten haben.
Eine weitere Möglichkeit, die Objektgröße zu ermitteln, wenn Sie keinen Profiler verwenden möchten, besteht darin, ein großes Array zuzuweisen und zu sehen, wie viel Speicher belegt ist. Sie müssen dies mehrmals tun, um eine gute Vorstellung von der durchschnittlichen Größe zu erhalten ist. Ich würde den jungen Raum sehr hoch einstellen, um GCs zu vermeiden, die Ihre Resultate verwirren, z. -XX:NewSize=1g
Es kann von JVM zu JVM abweichen, aber "Sizeof for Java" sagt
Sie erinnern sich vielleicht an "Java Tipp 130: Kennen Sie Ihre Datengröße?" Dies beschreibt eine Technik, die auf dem Erzeugen einer großen Anzahl von identischen Klasseninstanzen basiert und die resultierende Zunahme der JVM-verwendeten Heap-Größe sorgfältig misst. Wenn dies möglich ist, funktioniert diese Idee sehr gut, und ich werde sie tatsächlich verwenden, um den alternativen Ansatz in diesem Artikel zu starten.
Wenn Sie ziemlich genau sein müssen, sehen Sie sich den Instrumentierungsrahmen an.