Referenzen statt Objekte für große Speicherstrukturen

Status
Nicht offen für weitere Antworten.

huckfinn

Aktives Mitglied
Hi,

Ich habe mich gewundert, daß Java sehr viel mehr Speicher in einer Lookupstruktur als herkömmliche Sprachen verbraucht (siehe auch
www.java-forum.org/de/viewtopic.php?t=37725). Es ist etwas mehr als das doppelte zum herkömmlichen Code. Der Grund dafür liegt in der üppigen Speicherauslegung für Referenzobjekte. Ein Beispiel, eine TreeMap (AVL-Tree) mit einem Eintrag ..also Klasse Entry <K,V> hat folgende Referenzobjekte:

Key : Objekt - 8 Byte
Value : Objekt - 8 Byte
Left : Objekt - 8 Byte
Right : Objekt - 8 Byte
Parent : Objekt - 8 Byte
color: boolean - hoffentlich 1Byte

Je nach dem wieviel Objekte in den Containern Key und Value eingebettet sind werden für jede "Adressoperation" also Klassenreferenzen noch einmal das doppelte an Speicher verbraucht.

In den "älteren Sprachen" sind Key, Value, Left und Parent Adressen also für 32 Bit-Strukturen 4 Byte also die Hälfte.

Frage, gibt es eine Möglichkeit, das anders zu organisieren ..sprich referenzieren... Oder ist Java, weil es keine Adressoperatoren besitzt auf diesen Mechanismus festgelegt und verbraucht somit per Definition immer das doppelte an Speicher bei Referenzstrukturen (Objekt anstelle von Pointer). Weiß einer von den Gurus was?

Bis denne huck
 
S

SlaterB

Gast
zumindest kann man allgemein den Hinweis geben, das Java an sich ja plattformübergreifend ist/ sein soll,
von der Implementierung/ Speichernutzung selber also wenig weiß,

das ist evtl. ein Thema für Virtuellen Maschinen, die Java-Code interpretieren und ausführen,
nichts für Java an sich?
 

AlArenal

Top Contributor
Korrekt. Java als Sprache hat da wenig mit zu tun. Das sind Implementierungsdetails der VM. Erfahrungsgemäß ist es unabhängig von der tatsächlichen Implementierung eh immer falsch implementiert.

In diesem Falle:
Sinds 64 Bit ist die Verschwendung zu gro. Wären es 32 Bit wär der Adressraum zu klein.
 

huckfinn

Aktives Mitglied
Ok,

I'm confused ???:L.
..das Java an sich ja plattformübergreifend ist/ sein soll, von der Implementierung/ Speichernutzung selber also wenig weiß,
Der Verweis das man nicht wissen braucht wie was in dem Ding läuft macht mich kirre. Ich kann muß doch als ordentlicher Entwickler, wenn ich eine gute Applikation schreiben will, wissen wieviele Ressourcen ich brauche und wie mein Zielsystem, wie allgemein es durch die JVM auch sein mag es, implementiert. Das kann man doch nicht ins Reich der Heuristik verbannen. "He.. probier mal aus vieviel die JVM auf der Sun verbraucht damit mir die Applikation nicht mit eine HeapOverflow Exception austeigt." ..Und das mach ich dann noch für die anderen Plattformen. Was hat das mit Unabhängikeit zu tun. Oder ich gebe massig Heap frei, ..auch nicht fein, und habe eine potentiellen Resourcenfresser zu implementiert. Es laufen ja noch mehr Prozesse auf einer Maschine.

Und was soll das?
..Erfahrungsgemäß ist es unabhängig von der tatsächlichen Implementierung eh immer falsch implementiert.
Ich dachte man schreibt deterministisches Zeug und nicht fatalistische Mutmaßungen. Alles ander wäre doch nicht professionell.

Warscheinlich sollte man Java doch wieder in die Spielkiste stecken. Schade eigentlich, denn es wünderschöne Softwarekonzepte und endlich eine Reihe von Standerdisierungen gerade hinsichtlich der Algorithmen und Datenstrukturen ..also der ganze Kram unter java.util.*; . Warum die so viel Speicher brauchen ist allerdinges ein Manko.

Was solls, bis denne huck.
 
S

SlaterB

Gast
eines ist sicher, ein Java-Programm das auf WinXP 32 MB speicher braucht,
wird in der nächsten Windows-Version 64 MB Speicher belegen ;)

ne ist jetzt nur geraten, aber wie soll denn ein Programm auf Windows und Unix das gleiche tun,
auf verschiedenen Prozessoren, auf Handy mit 500 KB Hauptspeicher und auf den HighEnd-Systemen mit x GB?

das gilt auch für alle anderen Programmiersprachen!!,
sowas kann man allgemein nicht sagen,
der Unterschied ist nur: Java läuft überall (wenn es jeweils eine VM gibt), man weiß nur nicht wie genau ;)


wenn du den Speicher exakt bestimmen musst, na benutze eine andere Sprache,
in Java kannst du ein einfaches Hello World-Programm schreiben und dir sicher sein,
dass ALLEIN die VM für sich schon mal ein paar MB Speicher belegt und ein paar Sekunden zum starten braucht,

wenn du dann noch in deinem Programm ein simples Swing-Fenster aufmachst,
dann braucht vielleicht allein die Swing-Engine wieder eine nicht unerhebliche,
aber dennoch relativ unbekannte Menge an Speicher,

ganz abgesehen von den zur Laufzeit aufgesuchen nativen Graphik-Routinen,
von denen wiederum vielleicht nicht mal die VM weiß, was sie so genau tun und an Speicher verlangen,
hauptsache sie öffnen ein Fenster ;)


so, wahrscheinlich zum großen Teil nicht korrekt beschrieben,
aber die Tendenz sollte richtig sein ;)

wenn du dein System kennst und die VM dazu, dann kannst du sicherlich auch für Java einiges ausrechen,
genau wie in anderen Sprachen, wo man ebenso System und Compiler kennen muss
 

huckfinn

Aktives Mitglied
Hi,

Hast du Erfahrungen mit dem gcj (Gnujavacompiler)und classpath ..wird das da besser?

bis denne Huck
 

AlArenal

Top Contributor
huckfinn hat gesagt.:
Der Verweis das man nicht wissen braucht wie was in dem Ding läuft macht mich kirre. Ich kann muß doch als ordentlicher Entwickler, wenn ich eine gute Applikation schreiben will, wissen wieviele Ressourcen ich brauche und wie mein Zielsystem, wie allgemein es durch die JVM auch sein mag es, implementiert. Das kann man doch nicht ins Reich der Heuristik verbannen. "He.. probier mal aus vieviel die JVM auf der Sun verbraucht damit mir die Applikation nicht mit eine HeapOverflow Exception austeigt." ..Und das mach ich dann noch für die anderen Plattformen. Was hat das mit Unabhängikeit zu tun. Oder ich gebe massig Heap frei, ..auch nicht fein, und habe eine potentiellen Resourcenfresser zu implementiert. Es laufen ja noch mehr Prozesse auf einer Maschine.

Und was soll das?

Ich weiß ja nicht was für Monsteranwendungen du entwickelst. Ich entwickle Anwendungen welche in erster Linie funktionieren sollen. Ob ich sie dann mit nem 2 MB kleineren Memory Footprint hinbekommen könnte, ist mir völlig egal. Das vollziehe ich auch nicht nach. Und was die Plattformunabhängigkeit angeht ist die für mich im Job derzeit auch nicht relevant. Wir haben keine Kunden und kennen auch keine potenziellen Kunden, bei denen auf den Arbeitsrechnern etwas anderes als Windows läuft.

Das Ganze sieht im Embedded Bereich oder bei Handys anders aus. Das sind aber Spezialfälle, die eh nicht von der "normalen" VM bedient werden.

..Erfahrungsgemäß ist es unabhängig von der tatsächlichen Implementierung eh immer falsch implementiert.
Ich dachte man schreibt deterministisches Zeug und nicht fatalistische Mutmaßungen. Alles ander wäre doch nicht professionell.

Warscheinlich sollte man Java doch wieder in die Spielkiste stecken. Schade eigentlich, denn es wünderschöne Softwarekonzepte und endlich eine Reihe von Standerdisierungen gerade hinsichtlich der Algorithmen und Datenstrukturen ..also der ganze Kram unter java.util.*; . Warum die so viel Speicher brauchen ist allerdinges ein Manko.

Was solls, bis denne huck.

Mit Erbsenzählerei lässt sich nunmal in der Breite kein Geld verdienen und es interessiert den Kunden auch nicht.
 

huckfinn

Aktives Mitglied
Ok,

Dann habe ich eine Frage. Angenommen du hast eine Datenbank die ein Indexregister hat (nur die Adressen der dann üppig anwachsenden eigentliche Datensetst). Dieses Register hat eine Cursorvariable und einen Schlüssel als String. Ein webserver muß zeitweilig das Indexregister auslesen. Ein zweites Backend vergrößert bei Aktualisierungen das Register datenbankseitig, du weißt nicht zum Zeitpunkt des Webserverstartes nicht wie groß das Indexregister werden kann. Wie du siehst werden keine Erbsen gezählt. Ich will nur wissen wann ich die Speicherung der Indexstruktur untersetzen muß und wann ohne das der Webserver beim indizieren aussteigt.

Bis denne Huck
 

AlArenal

Top Contributor
Frag mal einen der selbst Datenabnekn entwickelt. Ich benutze sie lediglich und die Tatsache, dass komplett in Java geschrieben Datenbanksysteme existieren, die problemlos zig Millionen Records und zig Gigabytes an Daten verdauen sagt mir, dass es geht und in dem Fall ist mir "dass es geht" wichtiger als "wie es geht". Das interessiert mich (in dem Fall bin ich gewissermaßen der Kunde) nämlich dann nicht die Bohne. So wenig wie ich ein Auto bauen können muss, um es fahren zu können.

Schau dir den Source von H2 oder Derby oder HSQLDB an. Womöglich findest du da Antworten.
 

huckfinn

Aktives Mitglied
Hm,

Irgendwie ist es doch unbefriedigend nicht zu wissen was die JVM wann tut. Aber man muß vermutlich mit der Implentierung der selbigen beschäftigen. Es ist wie offensichtlich mit den API's der jeweiligen Betriebsysteme. Umgenau zu wissen was man da bastelt muß man wissen wie sie funktionieren. Wir haben also eine Maschine mehr ..eben eine virtuelle. Ich habe mir das echt einfacher vorgestellt.

Ich danke für alle Hinweise Huck
 

hupfdule

Top Contributor
Naja, aber das Konzept der VM wurde gerade für solche Fälle entwickelt, da du dir darum keine Platte mehr machen musst. Wenn du alles bis ins kleinste Detail kontrollieren willst, ist Java die falsche Sprache. Das ist bei anderen Sprachen C#, Python, etc. aber sicher nicht anders.
 
G

Guest

Gast
Hi,

Wie ermittelt eigentlich ein Profiler die Strukturgrößen? Faßt der den Bytecode an z.B. den Heap und den Stack?

Bis denne Huck
 

hupfdule

Top Contributor
hupfdule hat gesagt.:
Wenn du alles bis ins kleinste Detail kontrollieren willst, ist Java die falsche Sprache. Das ist bei anderen Sprachen C#, Python, etc. aber sicher nicht anders.

Offenbar hab ich mit der Aussage Verwirrung gestiftet. :) Was ich sagen wollte: In diesen Sprachen hat man so weit ich weiß das selbe "Problem", dass der exakte Speicherverbrauch nicht vollständig vorhergesagt werden kann. Einfach weil das nicht im Konzept der Sprachen vorgesehen ist.
 

byte

Top Contributor
Also für gewöhnlich entwirft man das Datenmodell und prüft dann, wie ob man Speicherprobleme kriegen könnte oder nicht. Falls ja, dann kann man Maßnahmen ergreifen, den Speicher zu minimieren (z.B. durch Caching). Ich habe aber echt noch nie gehört, dass jemand die Bytes von irgendwelchen Objekten aufaddiert. :roll:

Wir haben mal in nem Praktikum nen CAN-Controller entworfen. Auf dem Microcontroller lief ne abgespeckte Java VM auf iirc nen paar KB RAM. Selbst da hatten wir keine Speicherprobleme. Da war halt Geschwindigkeit ein Faktor (Vermeidung von Strings, "rechnen" mit Bitoperatoren, ...), aber nicht der Speicher.

Also mein Tipp: Leg diesen Optimierungswahn ab oder wechsel die Programmiersprache. Assembler bietet dahingehend dem Entwickler sicher sehr gute Kontrollmöglichkeiten... :D
 

huckfinn

Aktives Mitglied
Hi,

Es gibt ein ganz einfaches Beispiel der mit Optimierungswahn nichts zu tun hat. Angenommen du hast ein Bild z.B. ein CMKY oder ein Satellitenbild mit 4 oder 8 Kanälen, das Bild ist 1024x1024 Pixel groß und jeder Wert hat ein Byte Quatisierungsgröße. Du mußt davon ein mehrdimensionales ein Histogramm davon bauen. Einen adressierende Speicherstruktur dafür wäre
Code:
 int a[][][][]... Zahl der Kanäle = new int[1024][1024][1024][1024]...;
Es ist offensichtlich, daß der Speicher sofort platzt. Allerdings ist die Anzahl der möglichen Histogrammwerte nur Kanalanzahl x Megabyte. Mehr kann nämlich im Bild nicht drin sein. Das Speichesystem ist also schwach besetzt. Es ist also günstiger eine Suchstruktur zu benutzen z.B. eine
Code:
TreeMap
mit einem N-Kanaligen Schlüssel und einem
Code:
int
für das Histogramm der hochgezählt wird wenn der Schlüssel schon im Baum ist oder einen neuen Schlüssel erzeugt mit dem Histogrammwert 1 erzeugt wenn nichts gefunden wird. Also ist alles gut. Wenn ich jedoch jetzt ein Histogramm aus mehreren TreeMaps zusammenziehen will dann muß ihre Speichergröße kontollieren können um irgend wie wiederum zwischen Laufzeit und Speicher zu teilen und zu herrschen (.z.B Histogramminseln zu klassifizieren und rauszuswappen).

Nur son Beispiel Huck
:wink:
 

huckfinn

Aktives Mitglied
Ups kleiner Fehler es muß
Code:
int a[][][][]... Zahl der Kanäle = new int[255][255][255[255]...;
heißen der Speicher platz trozdem. Huck
 

byte

Top Contributor
Also bei CMYK werden die Farbwerte prozentual gespeichert, das heisst Dein Histogramm wird so initialisiert:

Code:
int[][][][] cmyk = new int[100][100][100][100];

Der Farbraum ist also nicht viel größer als bei RGB:

Code:
int[][][] rgb = new int[255][255][255];

Lässt sich also problemlos darstellen, allerdings nicht mehr mit der Standard Heapsize von 64 MB. Insofern hast Du schon recht. Ein Integer sind nun mal 32 bit Zahlenraum und Speichergröße in Java. Und ich bezweifel mal stark, dass andere Sprachen 32 bit in weniger als 32 bit Speicher kriegen. ;)

Ich verstehe Deine Kritik also nicht so wirklich. Und ich weiss auch nicht wirklich, was Deine geschilderten Problemfälle nun explizit mit Java zu tun haben. Das sind generelle Probleme, die in allen Sprachen existieren.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Best Practice Wie viele Referenzen machen Sinn? Weniger ist mehr? Allgemeine Java-Themen 1
J Mit Referenzen verkettet Listen. Allgemeine Java-Themen 9
A Referenzen von Bildobjekten löschen Allgemeine Java-Themen 0
kaoZ Best Practice Shared Actions , Referenzen in Gui halten ? Allgemeine Java-Themen 25
K Referenzen finden Allgemeine Java-Themen 6
R Referenzen im Heap anzeigen Allgemeine Java-Themen 3
M Datentypen Referenzen oder seperate IDs vergleichen? Allgemeine Java-Themen 6
D Problem mit Referenzen beim Serialisieren Allgemeine Java-Themen 3
W n:m Beziehung Referenzen löschen Allgemeine Java-Themen 5
A Methoden ohne Referenzen finden Allgemeine Java-Themen 9
E EMF Ecore Modell. Referenzen nach außen. Allgemeine Java-Themen 2
F Referenzen auf Objekte Allgemeine Java-Themen 5
hdi Speichergröße von Objekten & Referenzen Allgemeine Java-Themen 8
S Serialisierung und Referenzen Allgemeine Java-Themen 6
D Referenzen; == Allgemeine Java-Themen 2
D Referenzen weiterreichen vs. statischer Zugriff Allgemeine Java-Themen 3
G Pointer und Referenzen Allgemeine Java-Themen 3
I Referenzen in Datei speichern Allgemeine Java-Themen 2
G (De)serialisierung und Referenzen Allgemeine Java-Themen 5
J Bibliothek gesucht Ana_lysieren von wss. Referenzen Allgemeine Java-Themen 2
A ArrayListe :Doppelte entfernen -> keine Referenzen Allgemeine Java-Themen 26
O Vektor kopieren (Inhalt, nicht Referenzen) Allgemeine Java-Themen 3
M Übergabe von Referenzen Allgemeine Java-Themen 3
P Das leidige Thema: Referenzen Allgemeine Java-Themen 2
N int[] referenzen in ein Array packen, brauche Hilfe. Allgemeine Java-Themen 7
A Referenzen / HashCodes nicht konstant? Allgemeine Java-Themen 2
K Probleme mit Referenzen Allgemeine Java-Themen 2
S Textdatei statt von Dateisystem aus .jar lesen Allgemeine Java-Themen 3
ReinerCoder Case statt if else Abfragen?! Allgemeine Java-Themen 8
M Bei String.format ein Komma statt einem Punkt ausgeben lassen Allgemeine Java-Themen 1
A was kann ich nehmen als statt IsHitBy? Allgemeine Java-Themen 3
das_leon Komma statt Punkt Allgemeine Java-Themen 10
F Java moved Files statt sie zu kopieren Allgemeine Java-Themen 12
D Class<CAP#1> statt Class<...> Allgemeine Java-Themen 5
M Generics (bounded wildcards statt Interface Bezeichnern) -- Sinn oder Unsinn? Allgemeine Java-Themen 2
P Datentypen float mit komma statt punkt möglich? Allgemeine Java-Themen 6
D Shortcut statt Datei einlesen Allgemeine Java-Themen 2
K Collection.contains()/retainAll() mit Referenzgleichheit statt equals()? Allgemeine Java-Themen 2
H SwingWorker statt Thread für einen Server Allgemeine Java-Themen 2
R Dateiarbeit: In Datei weiterschreiben statt überschreiben Allgemeine Java-Themen 5
P SFTP mit ppk key statt openssh key Allgemeine Java-Themen 4
Meldanor For-Schleifen - byte statt int? Allgemeine Java-Themen 11
S indize statt split() Allgemeine Java-Themen 10
P Wieso HashMap-Zugriff mit Object, statt mit MyObject? Allgemeine Java-Themen 12
G Was nutzen statt Mehrfachvererbung? Allgemeine Java-Themen 7
G Arraylist statt List - Sehr schlimm? Allgemeine Java-Themen 8
N Hilfe: Bekomme statt '>' '&gt;' . Allgemeine Java-Themen 11
L Zwei Hashtables statt einer? Allgemeine Java-Themen 6
E Statt HashSet die TreeSet verwenden Allgemeine Java-Themen 4
R Window statt Frame Allgemeine Java-Themen 6
schegga_B javax.crypto - Cipher Objekte - Sevice Provider matching? Allgemeine Java-Themen 1
berserkerdq2 Weiß jemand wie ich im Scenebuilder das Fenster so darstellen kann, dass beim Vollbildmodus die Objekte so angezeigt werden? Allgemeine Java-Themen 1
A Einzelne Objekte und Unterobjekte einer ArrayList ausgeben Allgemeine Java-Themen 53
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
N einem Array Objekte hinzufügen die ihr Array position gespeichert haben Allgemeine Java-Themen 34
E Objekte in einen String packen und wieder laden Allgemeine Java-Themen 5
L Objekte in Set nicht gefunden Allgemeine Java-Themen 13
Avalon Data Transfer Objekte aus Datenbank erstellen Allgemeine Java-Themen 8
G Objekte mit Strings Aufrufen Allgemeine Java-Themen 8
H Objekte speichern und laden Allgemeine Java-Themen 10
H Objekte speichern und laden Allgemeine Java-Themen 1
MiMa Referenz auf Objekte und deren Inhalte Allgemeine Java-Themen 12
W Objekte reproduzieren Allgemeine Java-Themen 2
W Objekte per Reflexion instanziieren Allgemeine Java-Themen 7
W Unittest - Objekte simulieren Allgemeine Java-Themen 7
T OOP Objekte mit Erweiterung Initialisieren Allgemeine Java-Themen 6
O Erste Schritte Objekte als Datenelemente Allgemeine Java-Themen 14
J Equals Mock Objekte Allgemeine Java-Themen 5
J Mockito - Objekte miteinander vergleichen (equals) Allgemeine Java-Themen 6
N Bei Mouse Events nicht mehrere Objekte erstellen Allgemeine Java-Themen 13
J Zugriff auf erstellte Objekte einer Klasse von einer Klasse ausserhalb Allgemeine Java-Themen 3
J Java Objekte = null, Garbagecollector Allgemeine Java-Themen 12
F Listen - Mehrere Objekte Allgemeine Java-Themen 1
J Verständnis Frage zur Instanz, Objekte, Instanzierung, Referenz Allgemeine Java-Themen 14
F Objekte erzeugen Allgemeine Java-Themen 1
E Threads ThreadPoolExecutor remove mit callable Objekte Allgemeine Java-Themen 3
P mehrer Verschiedene Objekte in einer Klasse erstellen. Allgemeine Java-Themen 4
E OOP Objekte und Methoden Allgemeine Java-Themen 1
@SupressWarnings() Umgebungsvariable Objekte "gekoppelt" Allgemeine Java-Themen 6
S Algorithmus um Objekte auf einer Flaeche mit gleichem Abstand anzuordnen..? Allgemeine Java-Themen 20
C Objekte in Array List speichern? Allgemeine Java-Themen 1
OnDemand Objekte speichern Allgemeine Java-Themen 8
B Objekte anhand von Properties file Allgemeine Java-Themen 41
U Tiefe Objekte schreiben Allgemeine Java-Themen 1
R Abstrakte Basisklasse und instanzierte Objekte der abgeleiteten Klasse als Basisklasse übergeben Allgemeine Java-Themen 2
E 3D Objekte in 2D Bild finden Allgemeine Java-Themen 5
J Daten aus GUI auslesen und in Objekte umwandeln Allgemeine Java-Themen 6
F FileOutput/Input Objekte Allgemeine Java-Themen 6
OnDemand Objekte serialisieren Allgemeine Java-Themen 3
J unterschiedliche Objekte, selbe getter und setter Allgemeine Java-Themen 15
L Lib gesucht: Java-Objekte mit JSON Allgemeine Java-Themen 2
U Set erklären dass objekte gleich sind Allgemeine Java-Themen 12
E Best Practice Verdammt große Objekte Allgemeine Java-Themen 10
B Mehrere Objekte verschlüsselt serialisieren Allgemeine Java-Themen 6
G Liste anzahl der gleichen Objekte Allgemeine Java-Themen 6
N Objekte an eine andere Applikation übergeben Allgemeine Java-Themen 3
N 2 Objekte zu einer Gruppe zusammenfügen Allgemeine Java-Themen 7
M Instanzierte Objekte in XML Dokument speichern Allgemeine Java-Themen 3
B Verschiedene Objekte in Abhängigkeit eines Typs instanziieren. Allgemeine Java-Themen 17
K Input/Output Im Programm instanzierte Objekte Speichern und laden Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben