Frage

Ich möchte über Arbeitsspeicher-Overhead in Java fragen, Ich habe eine große Arraylist (61.770 Artikel), und zu versuchen, die Speichermenge von jedem Element (Zählen Sie das Objekt und seine Arraylist-Eintrag) genommen zu berechnen, durch Profilieren der App ich das bekommen, nachdem alle Daten geladen wird, nimmt der Heap ~ 25Mb. wenn die Arraylist hat nur 2 Elemente den Haufen nimmt ~ 1 MB, so etwa:

(24 * 1024 * 1024) / 61.768 = 407 Bytes.

aber , wenn ich die Felder des jeweiligen Objekts zählen, erhalte ich 148 Bytes (nicht der Arraylist einschließlich und unter der Annahme int = 4, float = 4, Referenz = 4), ich bin neugierig zu wissen, wo all diese zusätzlichen Bytes tat kamen aus ...

Das kann ich erraten, da die Objekte, die ich in der Arraylist gespeichert sind, eine Schnittstelle implementiert, die sie speichern zusätzliche Werte, möglicherweise die VM speichert ein 4Byte Funktionszeiger für jeden implementierten Methode? die Schnittstelle sie so thats 80 weitere Bytes, in Höhe von insgesamt 228 Bytes, noch nicht in der Nähe der 400 Bytes gemessen.

haben 20 Funktionen implementieren

Jede Hilfe würde geschätzt.


wow, vielen Dank für all die großen Antworten.

@Bolo. Danke für den Link, mit dieser Klasse i messen ~ 350 Bytes pro Objekt so kann ich am wenigsten bestätigen die Quelle des großen Speicherverbrauch

@Yuval A: Vielen Dank für diese Präsentation, eine wertvolle Informationsquelle

.

@Ukko. Punkt bemerkt

@Jayan. Jetzt NetBeans Profiler mir Fehler geben, wenn ich versuche, den Haufen zu werfen, wird es später noch einmal versuchen

War es hilfreich?

Lösung

Diese Ergebnisse überraschen nicht. Die JVM fügt enorme Mengen an Overhead für jedes Objekt.

Über die doppelte erwartete Größe für ein einzelnes Objekt, aufgrund JVM Speicher-Overhead, ist nicht ungewöhnlich.

Diese Präsentation hat eine wunderbar, eingehende Erläuterung und einen Überblick über verschiedene Datenstruktur der Speichernutzung in Java.

Andere Tipps

Ein Arraylist ist im großen und größer als die Anzahl der Elemente. Verwenden getCapacity() die aktuelle Größe des zugrunde liegenden Array zu erhalten.

Ein großes Problem mit Ihrem Ansatz ist die Interaktion mit dem Garbage Collector. Es macht im Grunde jeden Test, wie Sie völlig von außen undurchsichtig vorgeschlagen haben.

Als Gedankenexperiment, wenn Sie dies sollten Sie

tun wollte
  1. Feuer JVM und tun ein paar globale GCs alle Junk raus
  2. Messen Sie die Heap-Größe und Java Vorstellung davon, wie viel Freiraum hat.
  3. Führen Sie Ihren Test
  4. GC ein paar Mal
  5. Wiederholen Sie die Messungen von Schritt # 2

Nach allem, und ein wenig Mathematik, die Sie näher sein wird, aber immer noch nicht richtig. Die einzige wirkliche Lösung ist, um tatsächlich die Umsetzung fragen wie andere Leute erwähnt haben. Oder Figur it out aus der Kenntnis der Umsetzung.

Speicher verbraucht durch Arraylist ist ein wenig vage.

Nehmen Sie einen Heap Dump des Prozesses in geeigneten Stufen - nach Werten vollständig zugeordnet sind. Dann nutzen Sie Tools wie Memory Analyzer (von Eclipse).

Sie füllen flache finden und beibehalten Haufen Größen.

Als Seite beachten, da Sie genau wissen, wie viele Objekte in der Arraylist sein, warum nicht nur ein Array mit []? Wird die Anzahl der Objekte in dort ändern?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top