Meine Frage bezieht sich auf Speicherabdruck in Java für Klasse ohne Datenelement. Angenommen, in Java habe ich eine Klasse, die kein Datenelement hat und nur Methoden enthält. Wenn ich also eine Instanz einer bestimmten Klasse erstelle, belegt sie dann Speicher im primären Speicher außer dem Objekt-Referenzspeicher?Hat die Klasse ohne Datenelement einen Speicherbedarf in Java?
Antwort
Letztendlich kennt jedes Java-Objekt seine Klasse und hat optional ein Synchronisations-Grundelement (obwohl this
synthetisch sein kann). Das sind zwei Referenzen, auf die man schwer verzichten kann. Alles andere stammt aus dieser Klasse, also haben Sie einen Kostenrahmen, der mindestens 8 bytes in Java 1.3.1 betrug. Ein Profiler wird Ihnen die aktuellen Kosten mitteilen, wenn Sie sie wirklich brauchen.
Ja, das tut es, weil zumindest ein "leeres" Objekt zumindest einen Zeiger auf seine Typinformation hat.
Sie haben Recht. Deshalb habe ich in Frage gestellt, außer Objektreferenz/Zeiger. Also abgesehen von Referenz/Punkt hat es einen Speicherbedarf? –
Hängt von der JVM-Implementierung ab. Es wird wahrscheinlich eine Art von Synchronisierungsmechanismus pro Objekt geben oder Merker für den Garbage Collector. Meine beste Schätzung wäre mindestens 8 Bytes pro Objekt Overhead auf einem 32-Bit-Rechner. –
Der Overhead kann für eine 32-Bit-JVM bis zu 16 Byte betragen, abhängig von den JVM-Implementierungsdetails. Die Gemeinkosten umfassen die Größe des primitiven Objekts, die Verbindung zu der Klasse, die Darstellung des primitiven Mutex, die Darstellung des Identitäts-Hash-Codes, die Flags für die Finalisierung und so weiter. –
Lassen Sie uns klar sein. Verweise auf Ihr Objekt werden natürlich Raum einnehmen. Aber Ihr Objekt wird auch Platz für seinen "This" -Zeiger (d. H. Damit Sie verschiedene Instanzen unterscheiden können) und auch für die Felder von irgendwelchen Superklassen - z. Objekt - und schließlich was auch immer die internen Datenstrukturen des Heaps haben.
Benchmarking-Speicher ist wegen der verschiedenen Störquellen (wachsende Haufen, GC) schwierig, aber es ist immer noch ein Versuch wert:
public static void main(String[] args)
{
final int n = 1000000;
final Runtime runtime = Runtime.getRuntime();
final Object[] objects = new Object[n];
final long memory0 = runtime.totalMemory() - runtime.freeMemory();
for (int i = 0; i < objects.length; i++)
{
objects[i] = new Object();
}
final long memory1 = runtime.totalMemory() - runtime.freeMemory();
final long memory = memory1 - memory0;
System.out.printf(
"%s %s\n",
System.getProperty("java.vm.name"),
System.getProperty("java.vm.version"));
System.out.printf("%d %d %.1f\n", n, memory, 1.0 * memory/n);
}
Java HotSpot (TM) Server VM 14,3-b01 1000000 8000336 8,0
+1 für einen echten Test !! – mikera
- 1. Welchen Speicherbedarf hat ein methodenintensives Java-Objekt?
- 2. Java: Hat die Objektklasse einen Konstruktor?
- 3. Speicherbedarf von unique_ptr
- 4. Spezialisieren statisch constexpr Datenelement
- 5. Kafka Speicherbedarf
- 6. HTML5-Datenelement in Opera
- 7. Datenelement mit dem Klassennamen
- 8. RDD Speicherbedarf in Funken
- 9. minimieren Tomcat "pro Verbindung" Speicherbedarf
- 10. Speicherbedarf für "kurze" Felder in Dalvik?
- 11. Hat Java einen exponentiellen Operator?
- 12. Verwendung von const Datenelement in C++
- 13. Wie deklariert Array als Datenelement einer Klasse in JavaScript
- 14. Zugreifen auf Datenelement von RootViewController in einer anderen Klasse
- 15. wie die Java-Klasse laufen mit hat Paketnamen
- 16. einen Byte-Stream in eine Java-Klasse
- 17. Update-Klasse, die eine andere Klasse hat
- 18. Speicherbedarf von Haskell-Datentypen
- 19. Zeiger auf Datenelement umkehren
- 20. jQuery Datenelement seltsames Verhalten
- 21. Mehrere .NET-Prozesse Speicherbedarf
- 22. Wie man die Klasse deserialisiert, ohne einen Konstruktor aufzurufen?
- 23. Java-Klasse vs Array-Speichergröße?
- 24. DataSet-Klasse in Java?
- 25. Wie bringe ich den Breakpoint in die Klasse, ohne dass er seine Quelle hat?
- 26. Java springJDBC hat keine Methode in der Klasse CollectionFactory,
- 27. Welchen Umfang hat eine innere Klasse Singleton in Java?
- 28. ein statisches constexpr Datenelement der Basisklasse Initialisieren durch ein statisches constexpr Datenelement der abgeleiteten Klasse unter Verwendung
- 29. Ausführen von Java-Klassen ohne AppMain-Klasse in Intellij
- 30. Fehlende erforderlich strukturiertes Datenelement
+1 für die sehr gute Verbindung – Arne
Eine moderne JVM enthält die Objektüberwachungsdaten in unbenutzten Bits anderer Zeiger, die sie enthält (z. B. die unteren zwei Bits des Klassenzeigers) – dty
@Danny: Es sind drei Bits verfügbar; "Moderne" Speichermanager richten sich auf 8-Byte-Grenzen aus (wenn sie nicht mit Arrays arbeiten, die dichter sind). Und mit "modern" meine ich alles für 10 Jahre oder mehr. –