Java Speicher-Overhead

Ich würde Sie gerne Fragen, wie etwa Speicher-Overhead in java,
Ich habe eine große ArrayList (61,770 Elemente), und versuchen zu berechnen, wie viel Speicher, die jedem Element (Zählung das Objekt und seine ArrayList-Eintrag),
durch Profilierung der app bekomme ich dass, nachdem alle Daten geladen, wird der heap nimmt ~ 25 MB.
wenn die ArrayList hat nur 2 Elemente, die die heap-dauert ~1 MB , also etwa so:

(24*1024*1024)/61,768 = 407 bytes.

jedoch, wenn ich die Anzahl der Felder der einzelnen Objekte, bekomme ich 148 bytes(nicht einschließlich die ArrayList, und wenn int=4 float=4,reference=4), ich bin neugierig zu wissen, wo es all diese zusätzlichen bytes kamen...

ich kann mir vorstellen, dass da die Objekte Speichere ich in der ArrayList implementieren eine Schnittstelle, die Sie speichern zusätzliche Werte, vielleicht die VM speichert eine 4byte-Funktion Zeiger für jede implementierte Methode?
die Schnittstelle, die Sie implementieren, 20 Funktionen, so dass das ist, 80 bytes mehr insgesamt 228 bytes, die noch nicht in der Nähe der 400 bytes gemessen.

jede mögliche Hilfe würde geschätzt.


wow, danke für all die tollen Antworten.

@Bolo: danke für den link ,mit dieser Klasse, die ich Messen ~350 Byte pro Objekt, so kann ich zumindest bestätigen, die Quelle der großen Arbeitsspeicher.

@Yuval A: danke für diese Präsentation, eine wertvolle Quelle von Informationen.

@Ukko: Punkt hingewiesen.

@Jayan: jetzt NetBeans profiler gibt mir Fehler, wenn ich versuche heap-dump, wird versuchen Sie es später erneut.

  • Diese Artikel können für Sie nützlich sein: javaworld.com/javaworld/javatips/jw-javatip130.html
  • Wenn Sie beginnen mit new ArrayList(61770) anstelle von, zum Beispiel, new ArrayList() und dann lassen Sie es automatisch die Größe ändern, Sie würde auch einen unterschiedlichen Aufwand. Haben Sie die richtige Größe, bevor Sie Speicherauslastung?
  • 61 770 ist nicht groß 🙂 ich habe eine HashMap<Integer,Integer> so groß, dass Sie bringen die meisten Systeme in die Knie zu zwingen... Das ist der Grund, warum ich ersetzte Sie mit Fundgrube ist TIntIntHashMap, die sind einfach so viel mehr Speicher/Geschwindigkeit-effizient 🙂 Ach, es funktioniert nur mit primitiven :-/
InformationsquelleAutor user326841 | 2010-04-27
Schreibe einen Kommentar