«1. Введение
В этой статье мы рассмотрим различия между виртуальной машиной Java (JVM) и виртуальной машиной Dalvik (DVM). Сначала мы кратко рассмотрим каждый из них, а затем проведем сравнение.
Обратите внимание, что, начиная с Android 5.0, виртуальная машина Dalvik была заменена средой выполнения Android (ART).
2. Что такое среда выполнения?
Система выполнения предоставляет среду для перевода кода, написанного на языке высокого уровня, таком как Java, в машинный код, понятный центральному процессору (ЦП).
Мы можем различать следующие типы трансляторов:
-
Ассемблеры: они напрямую транслируют ассемблерные коды в машинный код, что делает его быстрым Компиляторы: они транслируют код в ассемблерный код, а затем он использует ассемблеры для перевода полученного кода в двоичный. Использование этой техники медленное, но выполнение быстрое. Кроме того, полученный машинный код зависит от платформы. Интерпретаторы: они переводят код во время его выполнения. Поскольку перевод происходит во время выполнения, выполнение может быть медленным
3. Виртуальная машина Java
JVM — это виртуальная машина для запуска настольных, серверных и веб-приложений Java. Еще одна важная особенность Java заключается в том, что она была разработана с учетом переносимости. Таким образом, виртуальная машина JVM была создана для поддержки нескольких хост-архитектур и работы везде. Но это слишком тяжело для встраиваемых устройств.
Java имеет активное сообщество и будет широко использоваться в будущем. Более того, HotSpot является эталонной реализацией JVM. Кроме того, сообщество с открытым исходным кодом поддерживает более пяти других реализаций.
С новым выпуском на основе каденции Java и JVM получают новые обновления каждые шесть месяцев. Например, мы можем перечислить некоторые предложения для следующих выпусков, таких как доступ к внешней памяти и средство упаковки.
4. Виртуальная машина Dalvik
DVM — это виртуальная машина для запуска приложений Android. DVM выполняет байт-код Dalvik, который скомпилирован из программ, написанных на языке Java. Обратите внимание, что DVM не является JVM.
Один из ключевых принципов проектирования DVM заключается в том, что он должен работать на мобильных устройствах с небольшим объемом памяти и загружаться быстрее по сравнению с любой JVM. Кроме того, эта виртуальная машина более эффективна, когда она запускает несколько экземпляров на одном устройстве.
В 2014 году Google выпустила Android Runtime (ART) для Android 5, которая заменила Dalvik для повышения производительности приложений при использовании батареи. Последняя версия была 1.6.0 на Android 4.4.
5. Разница между JVM и DVM
5.1. Архитектура
JVM — это виртуальная машина на основе стека, в которой все арифметические и логические операции выполняются с помощью операндов push и pop, а результаты хранятся в стеке. Стек также является структурой данных для хранения методов.
В отличие от DVM, это виртуальная машина на основе регистров. Эти регистры, расположенные в ЦП, выполняют все арифметические и логические операции. Регистр — это структура данных для хранения операндов.
5.2. Компиляция
Код Java компилируется внутри JVM в промежуточный формат, называемый байт-кодом Java (файлы .class). Затем JVM анализирует полученный байт-код Java и переводит его в машинный код.
На устройстве Android DVM компилирует код Java в промежуточный формат, называемый байт-кодом Java (файл .class), как и JVM. Затем с помощью инструмента под названием Dalvik eXchange или dx он преобразует байт-код Java в байт-код Dalvik. Наконец, DVM транслирует байт-код Dalvik в двоичный машинный код.
Обе виртуальные машины используют JIT-компилятор. Компилятор JIT — это тип компилятора, который выполняет компиляцию во время выполнения.
5.3. Производительность
Как было показано ранее, JVM — это виртуальная машина на основе стека, а DVM — это виртуальная машина на основе регистров. Байт-код виртуальной машины на основе стека очень компактен, поскольку расположение операндов неявно находится в стеке операндов. Байт-код виртуальной машины на основе регистров требует, чтобы все неявные операнды были частью инструкции. Это указывает на то, что размер кода на основе регистра обычно будет намного больше, чем байт-код на основе стека.
«С другой стороны, виртуальные машины на основе регистров могут выполнять вычисления с использованием меньшего количества инструкций виртуальной машины, чем соответствующие виртуальные машины на основе стека. Отправка инструкции VM требует больших затрат, поэтому сокращение количества выполняемых инструкций VM, вероятно, значительно улучшит скорость виртуальной машины на основе регистров.
Конечно, это различие имеет значение только при запуске виртуальной машины в интерпретируемом режиме.
5.4. Выполнение
Хотя можно настроить экземпляр JVM для каждого работающего приложения, обычно мы настраиваем только один экземпляр JVM с общими процессами и пространством памяти для запуска всех развернутых нами приложений.
Однако Android был разработан для запуска нескольких экземпляров DVM. Таким образом, для запуска приложения или службы ОС Android создает новый экземпляр DVM с отдельным процессом в общей памяти и развертывает код для запуска приложения.
6. Заключение
В этом уроке мы представили основные различия между JVM и DVM. Обе виртуальные машины запускают приложения, написанные на Java, но они используют разные методы и процессы для компиляции и запуска кода.