Wie wird die Object-Klasse implementiert (Methoden wie hashCode und interne Felder)?

8

Ich bin gespannt, wie die Object-Klasse implementiert ist. Zum Beispiel

  1. eine Methode hashCode () oder wait ()
  2. Wie ist der innere Staat repräsentiert? Zum Beispiel eine instrinsische Sperre oder die Datenstruktur zum Speichern von Threads, die object's wait ().
  3. aufgerufen haben

Um diese herauszufinden, habe ich eine Quelle von OpenJDK heruntergeladen und angefangen zu graben. Als erstes stieß ich auf die Datei \ openjdksrc \ jdk \ src \ share \ native \ java \ lang \ Object.c enthält unter anderem:

%Vor%

und nach meinem Verständnis definiert das Array methods [] eine Zuordnung zwischen den nativen Implementierungen der Methoden von Object. Zum Beispiel ist Objects hashCode () der JVM_IHashCode-Funktion zugeordnet. Der JVM_IHashCode ist in \ openjdksrc \ hotspot \ src \ share \ vm \ prims \ jvm.cpp implementiert. Und hier ist meine erste Frage. Warum ist dies bereits ein Teil der VM selbst (ist bereits in \ openjdksrc \ hotspot \ src \ share \ vm definiert)? Aber gehen wir zum Code von JVM_IHashCode:

%Vor%

Warum, wenn das Objekt null ist, geben wir hier 0 zurück? Ich schätze, dass eine NPE geworfen werden sollte. Andernfalls wird der FastHashCode von \ openjdksrc \ hotspot \ src \ share \ vm \ runtime \ synchronizer.cpp aufgerufen und irgendwann wird der get_next_hash aufgerufen, der den reellen Wert berechnet. Sobald es berechnet ist, ist die Frage, wo es gespeichert ist?

%Vor%

Also hat die oop-Klasse / struct (? ) eine markOop-Klasse / struct (? ), in der der Hash-Wert gespeichert ist. Funilly Ich kann diese Klassen / Strukturen nicht finden. Alles, was ich finden konnte, war:

%Vor%

in \ openjdksrc \ hotspot \ src \ teilen \ vm \ oops \ oop.hpp das scheint MarkOop in einem privaten Bereich zu haben. Aber was ist wirklich "oop", auf das im Rest des Codes Bezug genommen wird? Und wo MarkOop Definition zu finden? Ich habe eine entsprechende gefunden:

%Vor%

in \ openjdksrc \ hotspot \ src \ teilen \ vm \ oops \ markOop.hpp, aber es ist nur voll von enums und kann kein Feld finden, in dem der Hash-Wert gespeichert werden kann. Wenn jemand wenigstens einen Teil meiner Fragen beantworten könnte, wäre ich sehr dankbar. Danke!

    
Janek 08.12.2012, 13:07
quelle

1 Antwort

2

Der Hash-Code des Java-Objekts wird im Objektheader gespeichert, sobald er berechnet wurde.

Ссылка

Ссылка

von hotspot / src / share / vm / oops / markOop.hpp

%Vor%     
whunmr 08.12.2012 14:16
quelle

Tags und Links