2016-07-30 5 views
1

Ich habe die Interna von JVM von here gelesen und stieß auf den Begriff "native Zeiger", was bedeutet es, hat es etwas mit JNI zu tun?Was ist ein nativer Zeiger und returnAddress?

Im Text darüber spricht über Programmzähler und sagt:

Jeder Thread eines laufenden Programms einen eigenen PC-Register hat, oder Programmzähler, der bei der Erstellung der Thread gestartet wird. Das pc-Register ist ein Wort in der Größe, so dass es sowohl einen nativen Zeiger als auch eine returnAddress enthalten kann. Wenn ein Thread eine Java-Methode ausführt, enthält das PC-Register die Adresse der aktuellen Anweisung, die vom Thread ausgeführt wird. Eine "Adresse" kann ein nativer Zeiger oder ein Offset vom Beginn der Bytecodes einer Methode sein. Wenn ein Thread eine native Methode ausführt, ist der Wert des PC-Registers nicht definiert.

Von was ich verstehe, readAddress wäre jede Referenzadresse. Wie hier: Object o = new Object(); Hier würde o die Adresse des im Heap erstellten Objekts zurückgeben. Ist mein Verständnis richtig?

Jedes Beispiel, das beide erklärt, wäre großartig.

+0

Was meinen Sie mit "native Anweisung"? Auch die offizielle Dokumentation spricht darüber https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5.1 – rd22

+0

@ rd22 Eine native Anweisung ist eine Maschinencode-Anweisung der nativen CPU läuft der Code tatsächlich. –

+1

Dieses Dokument und das, das Sie in Kommentaren angeben, haben nichts mit JNI zu tun. Sie sprechen beide über das * Software * PC-Register, das von der JVM verwaltet wird und sich auf einen Bytecode-Befehl bezieht. Es kann entweder direkt auf einen Bytecode-Befehl zeigen ('nativer Zeiger', schlechte Wahl der Terminologie) oder ein Offset vom Start der aktuellen Methode sein. – EJP

Antwort

2

Hier würde o die Adresse des Objekts, das im Heap erstellt wurde, zurückgeben.

Die Variable speichert eine Referenz. Es ist ein Nachschlagewert, der für dieses Objekt eindeutig ist. Es könnte die Adresse sein, aber es könnte ein Wert sein, der in die Adresse übersetzt werden kann. z.B. 64-Bit-JVMs können 32-Bit-Referenzen bis zu einem 64-GB-Heap verwenden, wobei sie einen übersetzten Wert verwenden.

was bedeutet es, hat es etwas mit JNI zu tun?

Die CPU verwendet Zeiger zum Adressieren von Speicher. Um es von Referenzen zu unterscheiden, wird es in Java als "nativer" Zeiger bezeichnet.

JNI ist die Schnittstelle zu C-Code, der Zeiger verwendet.

Der Programmzähler des JVM ist in einer virtuellen Maschine fiktiv und für das Java-Programm nicht zugänglich.

Der tatsächliche Maschinencode verwendet einen Programmzähler, der von der CPU verwaltet wird. Sogar das ist etwas, was abstrakt ist, da eine CPU mehrere Befehle pro Taktzyklus ausführen kann, und zwar spekulativ zu jedem Zeitpunkt, an dem der Programmzähler nur der Punkt ist, zu dem Sie nicht zurückrollen können, oder es hängt von der ausgeführten Anweisung ab.

+0

Ich habe es immer noch nicht verstanden. Ich verstehe, dass der "native Zeiger" Referenzen für die CPU sind. Aber was ist dann der Unterschied zwischen "nativem Zeiger" und "Absenderadresse"? – rd22

+0

@ rd22 Eine Rücksprungadresse ist die Position des Codes, der nach der Rückkehr von einer Methode ausgeführt werden soll. –