Использует ли JVM системные вызовы для поиска функциональности ОС? - PullRequest
1 голос
/ 11 февраля 2020

Мы знаем, что JVM вызывает базовую систему для выделения памяти и времени ЦП, доступа к файлам и многого другого. Как он работает для достижения своей цели?

Использует ли JVM системные вызовы?

Ответы [ 3 ]

5 голосов
/ 11 февраля 2020

Использует ли JVM системные вызовы?

Да.

Как это работает внутри компании для достижения своей деятельности?

Типичный шаблон заключается в том, что некоторые методы в классе Java помечены как native. Когда JVM встречает вызов метода native, он делает вызов в код C или C ++, который является частью исполняемого файла JVM. Реализация собственного метода обычно выполняет следующее:

  1. Проверяет аргументы из Java и переводит их в C / C ++-совместимую форму. Например, String аргументы необходимо преобразовать в завершающуюся нулем форму.

  2. Вызвать стандартную библиотечную функцию C / C ++ с необходимыми аргументами.

  3. Функция библиотеки выполняет системный вызов.

  4. Операционная система делает свое дело, и системный вызов возвращает.

  5. Стандарт C / Функция библиотеки C ++ возвращает.

  6. Реализация собственного метода проверяет «errno». Если произошла ошибка, он создает объект исключения Java и выдает его.

  7. В противном случае реализация нативного метода преобразует результаты, например, c в Java объекты и возвращает их вызывающему методу Java.

Детали различаются в зависимости от того, что делает нативный метод.

Если вы хотите получить более глубокое понимание, я рекомендую вам извлечь копию исходного дерева OpenJDK и начать траление. (Вы должны сделать трудные дворы самостоятельно ....)

2 голосов
/ 11 февраля 2020

Действительно, JVM необходимо использовать системные вызовы, которые являются способом операционной системы, позволяющим процессам взаимодействовать с базовыми системными ресурсами.

Вы можете запустить strace java -version, чтобы увидеть группу системных вызовов (mmap , mprotect, openat, et c.), Выполненные даже во время этого очень ограниченного запуска java / jvm.

Еще один хороший способ узнать больше - это копать исходные коды JVM для собственных методов. Одним примером может быть реализация метода FileChannel # force , который внутренне вызывает системный вызов fsync (например): https://github.com/AdoptOpenJDK/openjdk-jdk11u/blob/5f01925b80ed851b133ee26fbcb07026ac04149e/src/java.base/unix/native/libnio/ch/FileDispatcherImpl.c#L172

0 голосов
/ 11 февраля 2020

Да, системные вызовы - единственный способ, которым ОС разрешает доступ к любой программе.

В случае Java именно поэтому некоторые «особенности», специфичные для ОС c, просматриваются, что портит идеал однократной записи в любом месте. Например, у меня была программа, которую я разработал при ошибке Windows box при запуске на Linux box.

Проблема оказалась в том, что в каталоге ресурсов имя файла было все более низкий регистр, но моя программа имела имя файла в смешанном регистре. Программа работала на windows, поскольку имена файлов на windows не чувствительны к регистру, но в Linux они чувствительны к регистру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...