Grundsatzfrage: Belegt eine Referenz auf 'null' RAM, und wenn ja - wieviel ;-) ?

inflamer

Bekanntes Mitglied
Hallo Forum,

die Frage stellt sich für mich deshalb, da mein Proggi große Datenmengen im RAM verwaltet, und zwar in Form von Datensätzen aus jeweils mehreren Strings.

Derzeit speichert die Dataset getaufte Klasse Leerstrings als 'null', wovon ich mir seinerzeit wohl RAM-Einsparung versprochen hatte, was aber mit allerhand if-Statements und damit tendenziellen Performace-Einbußen verbunden ist.

Als ich nun durch den alten Quellcode streifte, leuchtete mir auf, dass obige Maßnahme nur dann Sinn hat, falls die Java VM intern für 'null' keine Referenz im RAM speichert. Denn sonst könnte man genauso einfach eine...

Java:
private static final String EMPTY = ""

...Konstante etablieren und bei 'isEmpty()' darauf verwesen, statt 'null' zu speichern.


Daraus dann (sorry für die Länge) ergibt sich die zweite Frage: Ist eine solche Konstante dann überhaupt sinnvoll oder hält etwa die VM für den "Sonderfall" Leerstring eine einzige gesharte Instanz im RAM?

Vielen Dank!
 
Zuletzt bearbeitet:
null muss natuerlich auch Speicher belegen. Du hast ja einen Zeiger fuer diese Variable, der muss da sein und belegt damit Speicher. Zusaetzlich muss ein Feld in einer Klasse ebenfalls allokiert sein, vielleicht nur mit null, aber es ist ja da.

die Frage stellt sich für mich deshalb, da mein Proggi große Datenmengen im RAM verwaltet, und zwar in Form von Datensätzen aus jeweils mehreren Strings.
Vielleicht kurz ueber meine Wiederholung zu Strings lesen, nur um sicher zu gehen das wir da dann am gleichen Wissensstand sind.

Derzeit speichert die Dataset getaufte Klasse Leerstrings als 'null', wovon ich mir seinerzeit wohl RAM-Einsparung versprochen hatte, was aber mit allerhand if-Statements und damit tendenziellen Performace-Einbußen verbunden ist.
Ich kenne deine Software nicht, aber das klingt eher so als wuerdest du versuchen etwas zu optimieren wo du nocht nicht weiszt was optimiert werden muss. Du solltest dich mal mit String und der Garbage Collection beschaeftigen und dann mit so etwas wie VisualVM den Speicher wirklich betrachten um festzustellen wo es die Moeglichkeit zur Optimierung gibt.
 
Du willst eigentlich in java nur dann optimieren wenn der schuh drückt oder du siehst dass man da was machen kann, blind optimieren hilft meistens gar nichts
 
...Konstante etablieren und bei 'isEmpty()' darauf verwesen, statt 'null' zu speichern.
Es bleibt sich gleich ob ich null durch "" ersetze und string.isEmpty() aufrufe oder Objects.isNull(string) oder auch Objects.nonNull(string) verwende - es wird an dieser Stelle kein if-Statement eingespart. Bei deiner Variante verlierst du aber die Information, ob es sich bei den Daten tatsächlich um einen Leerstring oder null handelt. Dort wo man auf einen none-null-String angewiesen ist (Anzeige etc.), verwendet man dann einfach Objects.toString(string, "<null>") oder String.valueOf(string). Dann läuft man auch in kein Problem, wenn irgendwann mal ungewollt null auftauchen sollte.
 
Hier mal etwas ausführlicher etwas über Optimierung im Quellcode in Hochschprachen:

die Frage stellt sich für mich deshalb, da mein Proggi große Datenmengen im RAM verwaltet, und zwar in Form von Datensätzen aus jeweils mehreren Strings.
Und wenn ich mir mal die Spitzfindigkeit erlauben darf: Dein Programm verwaltet ganz sicher keinen RAM, jedenfalls nicht wenn du in Java und unter Windows arbeitest. Da wird der RAM in erster Linie von der Speicherverwaltung verwaltet (daherder Name 😉 ), und ganz am Ende von der JVM. Die läßt sich vom Betriebssystem nicht exakt soviel Speicher zuweisen wie sie braucht, sondern immer etwas mehr. Die JVM holt sich z.B. 100MB vom Betriebssystem, und arbeitet damit, auch wenn sie im gesamten Programmverlauf nur 42MB benötigt. Und erst wenn sie mehr benötigt (oder eine gewisse Sicherheitsreserve überschritten hat), verlangt sie nach mehr Speicher. Z.B. 150MB, auch wenn 110MB genügt hätten.
 

Neue Themen


Zurück
Oben