Как виртуальная машина Java связывает функцию пользовательского уровня со своими внутренними функциями?

Как JVM транслирует API в свою реализацию внутри JVM?

Это похоже на реализацию «системного вызова Linux Kernel»? Если да, то где эти интерфейсы? Надеюсь увидеть исходный код.

введите здесь описание изображения

Рисунок из https://www.artima.com/insidejvm/ed2/introarch4.html< /а>

e.g. ,

Любая реализация виртуальной машины Java должна позаботиться о подключении этих методов класса ClassLoader к внутренней подсистеме загрузчика классов.

https://www.artima.com/insidejvm/ed2/jvmP.html


person skytree    schedule 03.12.2017    source источник
comment
Ваш вопрос вообще не ясен. Вы спрашиваете, как Java компилируется в набор инструкций JVM, как эти инструкции интерпретируются, как нативные методы адаптируют Java API к системно-зависимым реализациям или как JIT-компиляция создает оптимизации для конкретной архитектуры? OpenJDK имеет открытый исходный код. Вы можете сами убедиться, как все это делается в наиболее часто используемой JRE.   -  person erickson    schedule 03.12.2017
comment
@erickson Спасибо за построение и уточнение моего вопроса. Поскольку я плохо понимаю эту часть, мой вопрос расплывчатый и не сложный. Если я это понимаю, я могу поставить ясный вопрос. Эти две части дополняют друг друга...   -  person skytree    schedule 03.12.2017
comment
Кажется, вы спрашиваете о JNI, которую вы можете просто посмотреть, или о том, как работает интерпретатор, что слишком широко. Остается неясным. Это не очень большая диаграмма, так как она полностью игнорирует существование интерпретатора.   -  person user207421    schedule 04.12.2017
comment
Спецификация JVM преднамеренно расплывчата в отношении того, как это должно работать, поскольку они хотят оставить разработчику JVM разработку этих низкоуровневых деталей. JVM обеспечивает вызовы метода C через JNI. Эти методы C, в свою очередь, могут выполнять системные вызовы обычным способом, которым C делает эти вызовы.   -  person Peter Lawrey    schedule 04.12.2017


Ответы (1)


Связанный вами API (https://docs.oracle.com/javase/7/docs/api/) — это, по сути, обычная библиотека классов. Когда вы установили JDK, появится файл src.zip или src.jar, в зависимости от версии, содержащий простой исходный код Java большей части этой библиотеки. Во всех версиях до Java 8 включительно скомпилированные классы API предоставляются в виде обычных файлов jar, причем большинство классов API находится в формате rt.jar. Начиная с Java 9 используются новые файлы модулей, однако большая часть API реализована в виде обычного кода Java.

Вы даже можете просмотреть исходный код определенных версий в Интернете, например. это реализация Object.toString() версии 8, обновление 40, бета-версия 25, размещенная по адресу grepcode.com.

Таким образом, для большинства методов нет ничего «похожего на системный вызов ядра Linux», когда вы вызываете метод API. Он работает как обычный вызов метода, и оптимизатор может даже встроить специальный код JRE в код вашего приложения во время выполнения. Вы также можете войти в код JRE во время отладки.

Только несколько методов не реализованы в виде простого кода Java, например. Object.getClass() — это метод native, который может быть реализован только особым образом для JVM.

Существует два основных способа реализации этих методов. Существует стандартизированный интерфейс JNI, позволяя взаимодействие произвольного собственного кода и кода Java. Он включает специальную связь между вызовами методов Java, объявленных native, и их реализацией через JNI. Но некоторые методы вместо этого обрабатываются JVM как внутренние операции, что подразумевает, что вызовы этих хорошо известных методов (например, getClass()) обрабатываются непосредственно интерпретатором/оптимизатором, как выделенная инструкция байт-кода. Эта очень эффективная обработка иногда даже используется для методов, которые имеют обычную реализацию Java, когда есть более эффективная альтернатива для конкретной платформы. Например, Integer.rotateLeft и rotateRight имеют чистую реализацию Java, но если фактический ЦП, используемый во время выполнения, имеет специальные инструкции для побитового чередования, все оптимизирующие JVM заменят вызовы этих методов встроенными операции с использованием этих инструкций ЦП.

person Holger    schedule 04.12.2017
comment
почему OpenJDK не включает JRE от hg clone http://hg.openjdk.java.net/jdk9/dev? Это может быть отчасти причиной того, что я скучаю по JRE. - person skytree; 04.12.2017
comment
Способ, которым исходный код был связан с JDK, был установлен задолго до того, как Java стал проектом с открытым исходным кодом, и никогда не менялся, потому что этого ожидают существующие инструменты разработки. Java 9 изменила некоторые старые структуры каталогов, но не так радикально. Вы можете обсудить, как будущие версии Java должны быть объединены или развернуты, но Stackoverflow — неподходящее место для таких дискуссий. - person Holger; 05.12.2017