# Speicheradresse auf die eine Referenz zeigt ausgeben



## StabiloSpider (7. Dez 2011)

Hallo @ all!

Ich würde gerne die Speicheradresse einer Referenz bzw. eines Objektes auf der Konsole ausgeben lassen.

Hab ich in JAVA die Möglichkeit dies zu bewerkstelligen? ???:L

Für eure Antworten vielen Dank!


----------



## faetzminator (7. Dez 2011)

Vielleicht findest du irgendwelche internen Klassen von Sun, welche das bewerkstelligen können. Aber eigentlich geht das nicht, da sich alleine die JVM um den Speicher kümmert. Für was willst du so was?


----------



## SlaterB (7. Dez 2011)

wie genau definiert sich Speicheradresse? reicht ein beliebiger Pseudowert wie hashCode()?


----------



## HoaX (7. Dez 2011)

Oder alternativ System (Java 2 Platform SE v1.4.2) anschauen. Dann hat man einen anderen Wert bei allen Objekten, auch wenn equals(true) liefern und der implementierte Hashcode den selben Wert liefern würde.


----------



## cable545 (7. Dez 2011)

Es ist eigentlich nicht Sinn von Java sich mit Speicheradressen Speicherarithmetik und Ähnlichem zu beschäftigen. Wie "faetzminator" schon angemerkt hat, kümmert sich die JVM um die Speicherverwaltung.


----------



## StabiloSpider (7. Dez 2011)

Zunächst einmal Danke für eure schnelle Antwort. :toll:

Mir geht es im Grunde darum, herauszubekommen wie ein Objekt einer Klasse im Speicher angeordnet wird. (Ich weiss, eigentlich kann mir das egal sein, aber ich interessiere mich dafür).

D.h., erzeuge ich eine Objekt einer KlasseA (KlasseA r = new KlasseA(); ), ist r eine Variable vom Referenzdatentyp KlasseA und gleichzeitig meine symbolische Adresse. In der Speicherzelle von r, steht nun eine Referenz (Verweis) auf eine weitere Speicherzelle (bspw. Speicherzelle 104) in der sich mein eigentliches Objekt befindet.

Angenommen KlasseA hält ein Attribut vom Typ byte und ein Attribut vom Typ int. Sind diese beiden Datentypen nun nacheinander im Speicher angeordnet, d.h. r verweist auf das erste Bit meiner byte Variablen (somit auf Speicherzelle 104) und im Anschluss (also in der nächsten Speicherzelle) finde ich meine zweite int-Variable ?????? ODER sind beide Variablen in irgendeiner Speicherzelle im Speicher angeordnet ???:L


----------



## faetzminator (7. Dez 2011)

Grundsätzlich: Alles ist irgendwo  Zumindest wenns im RAM liegt...


----------



## langhaar! (7. Dez 2011)

Dann wirst du dir wohl mal die Implementierung einer JVM ansehen müssen.

Alternativ könntest du Assembler lernen; da lässt sich herausfinden, was wo abgelegt ist.


----------



## Noctarius (7. Dez 2011)

StabiloSpider hat gesagt.:


> Zunächst einmal Danke für eure schnelle Antwort. :toll:
> 
> Mir geht es im Grunde darum, herauszubekommen wie ein Objekt einer Klasse im Speicher angeordnet wird. (Ich weiss, eigentlich kann mir das egal sein, aber ich interessiere mich dafür).
> 
> ...



Dir ist aber schon klar, dass sich eine Millisekunde nach Ausgabe die Speicherposition durch einen GC ändern kann?


----------



## irgendjemand (7. Dez 2011)

Noctarius hat gesagt.:


> Dir ist aber schon klar, dass sich eine Millisekunde nach Ausgabe die Speicherposition durch einen GC ändern kann?



sorry ... aber das glaub ich irgendwie nicht da der GC eigentlich nur dazu da ist nicht mehr referenzierte objekte aufzuräumen ...

so lange du bis zum untersten element eine referenz-kette bilden kannst ändern sich die speicher-adressen nicht ...

@TO
es ist eigentlich nicht im sinne von java mit stack-pointern um sich zu schlagen ...
intern muss die VM das zwar um mit der speicher-verwaltung des OS klar zu kommen ...
aber für den normalen byte-code ist dies glaube ich so gut wie nicht möglich ...
höchstens über reflections in klassen wie Object oder Class versuchen mit den native-methoden rum zu experimentieren ... oder wie schon angedeutet mit klassen in com.sun bzw sun.* ... aber selbst wenn : was hast du dann damit vor ? verändern wirst du diese schlecht können ...


----------



## Noctarius (7. Dez 2011)

irgendjemand hat gesagt.:


> sorry ... aber das glaub ich irgendwie nicht da der GC eigentlich nur dazu da ist nicht mehr referenzierte objekte aufzuräumen ...
> 
> so lange du bis zum untersten element eine referenz-kette bilden kannst ändern sich die speicher-adressen nicht ...



Lese mal nach wie Generational Garbage Collectors funktionieren. In der Compact-Phase werden die Objekte umkopiert um der Speicher-Fragmentierung entgegen zuwirken.


----------



## irgendjemand (7. Dez 2011)

hmm k ... man lernt nie aus ... *wobei das mit der fragmentierung sehr logisch klingt*

aber alleine das zeigt doch schon das man von speicherarithmetik in java die finger lassen sollte ...


----------



## Marco13 (7. Dez 2011)

Jupp, für Arrays und JNI gibt's da extra das Konzept des "Pinnings", wo man dem GC sagen (oder empfehlen) kann: "Sieh' mal zu, dass du den Speicher nicht bewegst, ich greif' da gerade drauf zu" ( Overview of the JNI Design )


----------

