Hallo,
Ich bin zwar nicht Robert, habe mich aber mit dem Speichermanager und dem Garbage Collector von .Net etwas beschäftigt. Deshalb antworte ich mal.
Zitat von
negaH:
Wir haben einen Speicher den wir in 2 Teile splitten. Der 1. Block enthält allozierte gültige Objekte der 2. Block enthält freien Speicher. Die Grenze zwischen diesen Blöcken stellt unsere Heapgrenze dar, also der Ort an dem ein neues Objekt seinen Speicher bekommmt. Wenn das so richtig ist dann ist dies ein stinknormales Verhalten eines jeden Speichermanagers. Ich sehe da jetzt keinen Unterschied der mit "Relokalsierung" -> "örtlichen Verschiebungen" zu tuen haben soll.
Relokalisierung passiert natürlich erst, wenn der Speicher fragmentiert ist, und keine solche scharfe Grenze zwischen belegtem und freiem Speicher existiert. Dann kommt der Speichermanager und defragmentiert den Speicher, so dass eben dieser Zustand wieder hergestellt wird. Wie jeder gute Speichermanager benutzt natürlich auch der von .Net unterschiedliche Speicherblöcke für unterschiedliche Datengrößen.
Zitat von
negaH:
Denn eine dynamische Defragmentierung kann immer nur freie Speicherblöcke zusammenfassen wenn der Speichermanager die allozierten Blöcke ebenfalls zur Laufzeit verschieben kann. Dies bedeutet aber das alle Refernezen auf diese Speicherblöcke als indirekte Zeiger verwaltet werden müssen, da ansonsten bei direkten Zeigern diese ja nach der Defragmentierung ins Nirwana zeigen.
Bei JAVA als "interpretierende" Plattform ist das noch vorstellbar.
Die Indirektion hat doch nichts mit interpretieren zu tun. Außerdem wird Java heutzutage eher selten interpretiert. Ganz im Gegenteil ist diese Indirektion ein integraler Bestandteil des Sicherheitssystems von .Net. Ohne diese könnte das so nämlich nicht funktionieren.
Zitat von
negaH:
Was soll ich mir darunter vorstellen ? Ein Objekt liegt auf dem Speicher und wenn es mehrfach benutzt wird -> sprich mehrfach referenziert wird dann liegt denoch nur 1 Objekt im Speicher. Oder liegen mehrere Objekte im Speicher und der Laufzeitcode erkennt nun das davon x Objekte merhfach durch andere y Objekte benutzt werden und gruppiert sie dann entsprechend ? Wozu ? und wie erkennt der Code zur Laufzeit das diese Objekte mehrfach benutzt werden durch andere Objekte bzw. Zeiger darauf ?
Ich vermute, der MM macht letzeres. Er gruppiert Objekte, die z. B. zusammen von einem Elternobjekt erstellt wurden. Der Vorteil ist eigentlich recht einfach zu erkennen, beim Aufräumen des Speichers entstehen z. B. nicht drei kleine Lücken, sondern eine große. Das verhindert, dass der Speicher oft defragmentiert werden muss. Außerdem hängt das
IMHO mit dem Garbage Collector zusammen, der Objekte nach ihrer bisherigen Lebensdauer gruppiert. Ich vermute, der übenimmt diese Gruppierung nebenher.
Gruß
xaromz