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 в двоичный машинный код .
Обе виртуальные машины используют компилятор Just-In-Time ( JIT ) . Компилятор JIT — это тип компилятора, который выполняет компиляцию во время выполнения.
5.3. Производительность
Как было показано ранее, JVM — это виртуальная машина на основе стека, а DVM — это виртуальная машина на основе регистра. Байт-код виртуальной машины на основе стека очень компактен, поскольку расположение операндов неявно находится в стеке операндов. Байт-код виртуальной машины на основе регистров требует, чтобы все неявные операнды были частью инструкции. Это указывает на то, что размер кода на основе регистра обычно будет намного больше, чем байт-код на основе стека.
С другой стороны, виртуальные машины на основе регистров могут выполнять вычисления с использованием меньшего количества инструкций виртуальной машины, чем соответствующие виртуальные машины на основе стека. Диспетчеризация инструкции VM требует больших затрат, поэтому сокращение количества выполняемых инструкций VM, вероятно, значительно улучшит скорость VM на основе регистров .
Конечно, это различие имеет значение только при запуске виртуальной машины в интерпретируемом режиме.
5.4. Исполнение
Хотя можно настроить экземпляр JVM для каждого работающего приложения, обычно мы настраиваем только один экземпляр JVM с общими процессами и пространством памяти для запуска всех развернутых нами приложений.
Однако Android был разработан для запуска нескольких экземпляров DVM. Таким образом, для запуска приложения или службы ОС Android создает новый экземпляр DVM с отдельным процессом в общей памяти и развертывает код для запуска приложения.
6. Заключение
В этом уроке мы представили основные различия между JVM и DVM. Обе виртуальные машины запускают приложения, написанные на Java, но они используют разные методы и процессы для компиляции и запуска кода.