- Как называется Java виртуальная машина платформы Android?
- Что такое среда Dalvik и art?
- На чем написана виртуальная машина Java?
- Как работает виртуальная машина Java?
- Для чего нужна виртуальная машина Java?
- Что такое кэш Dalvik?
- Что за программа Java Oracle?
- Какие игры были написаны на Java?
- Что было написано на Java?
- Как работает сборщик мусора в Java?
- Как запустить виртуальную машину Java?
- Как работает виртуальная машина?
- Для чего нужен JDK?
- Что такое JVM и для чего она нужна?
- Что такое JDK JRE JVM и компилятор?
- Android изнутри: сравнение Dalvik и ART
- Виртуальная машина
- Android Dexer
- R8 и сокращение кода
- ART vs DVM в Android
- JIT + AOT в ART
- Пять столпов Android. Технологии, лежащие в основе самой популярной ОС
- Содержание статьи
- Виртуальная машина
- Продолжение доступно только участникам
- Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
- Вариант 2. Открой один материал
- Евгений Зобнин
Как называется Java виртуальная машина платформы Android?
Dalvik — регистровая виртуальная машина для выполнения программ, написанных на языке программирования Java, созданная группой разработчиков Google во главе с Дэном Борнштейном (англ. Dan Bornstein). Входит в мобильную операционную систему Android.
Что такое среда Dalvik и art?
Dalvik Virtual Machine (DVM) — виртуальная Java машина, разработанная и написанная Дэном Борнштейном (англ. Dan Bornstein) и другими, как часть мобильной платформы Android. Можно сказать, что Dalvik — это среда для выполнения компонентов операционной системы Android и пользовательских приложений.
На чем написана виртуальная машина Java?
Самый первый компилятор Java был разработан Sun Microsystems и был написан в C году с использованием некоторых библиотек из C++. Сегодня компилятор Java написан на Java, а JRE — на C. … Компилятор Java записывается как программа Java, а затем компилируется с компилятором Java, написанным в C(первый компилятор Java).
Как работает виртуальная машина Java?
JVM (виртуальная машина Java) действует как механизм времени выполнения для запуска приложений Java. JVM — это то, что фактически вызывает метод main, присутствующий в коде Java. JVM является частью JRE (Java Runtime Environment). Java-приложения называются WORA (Write Once Run Anywhere, Пиши однажды запускай везде).
Для чего нужна виртуальная машина Java?
JVM может также использоваться для выполнения программ, написанных на других языках программирования. … Виртуальные машины Java обычно содержат интерпретатор байт-кода, однако, для повышения производительности во многих машинах также применяется JIT-компиляция часто исполняемых фрагментов байт-кода в машинный код.
Что такое кэш Dalvik?
Dalvik Caches — это не что иное, как временная компиляция кода приложения, хранящегося в качестве исполняемых файлов. Поскольку они могут быть скомпилированы динамически из исходного кода приложения, сидящего за пределами кэша Dalvik, вы можете очистить кэш Dalvik без какого-либо реального штрафа.
Что за программа Java Oracle?
Oracle Java. Java — язык программирования и платформа разработки № 1. Java снижает затраты, сокращает сроки разработки, стимулирует инновации и улучшает работу приложений.
Какие игры были написаны на Java?
Истории успешных игр, написанных на Java, включают в себя RuneScape и Minecraft. Альфа-версия игры была создана всего за 6 дней. Minecraft — вторая самая продаваемая игра в мире. Изначально она называлась «Cave Game».
Что было написано на Java?
А вот Вам и ответ — мы прописали основные направления, где используется Java:
- Java прежде всего — это язык, который используется для серверных приложений в крупных корпорациях. …
- Вэб-приложения. …
- Трейдинговые приложения. …
- Android приложения. …
- Десктопные приложения, программные средства и средства разработки.
Как работает сборщик мусора в Java?
Сборщик мусора запускается виртуальной машиной Java (JVM). Сборщик мусора — это низкоприоритетный процесс, который запускается периодически и освобождает память, использованную объектами, которые больше не нужны. Разные JVM имеют отличные друг от друга алгоритмы сбора мусора.
Как запустить виртуальную машину Java?
В Windows 10 нажмите горячие клавиши Windows + X и выберите пункт «Командная строка» в меню пользователя. Вы увидите приглашение командной строки с мигающим курсором. Введите команду «java -version», только без кавычек и нажмите Enter. Обратите внимание на первую строку — «1.8.0_111», это и есть версия JVM.
Как работает виртуальная машина?
Виртуальная машина — это компьютерный файл (обычно его называют образом), который действует как обычный компьютер. … Виртуальная машина отделена от остальной части системы, то есть программное обеспечение виртуальной машины не может вмешиваться в работу основной операционной системы компьютера.
Для чего нужен JDK?
JDK/Java SDK = Java Development Kit/Java Software Development Kit — то, что вам нужно для написания программ, требующих Java или использующих библиотеки, написанные на Java. Например, если бы вы написали свой собственный текстовый инструмент в Java.
Что такое JVM и для чего она нужна?
Знакомство с виртуальной машиной Java. Java virtual machine (JVM) — это программа, предназначенная для выполнения других программ. … JVM имеет две основные функции: Позволяет запускать Java-приложения на любых устройствах или операционных системах (принцип — «Написал один раз, запускай везде»)
Что такое JDK JRE JVM и компилятор?
Состоит из виртуальной машины и библиотек Java классов. … JDK (Java Development Kit) — комплект разработчика приложений на языке Java, включающий в себя компилятор, стандартные библиотеки классов Java, примеры, документацию, различные утилиты и исполнительную систему JRE.
Источник
Android изнутри: сравнение Dalvik и ART
Привет, Хабр! Около полугода назад я публиковал подробный «гайд» по JVM. Пост, в целом, зашел, а в комментариях спросили, не планируется ли “чего-то по андроиду”. Наконец, у меня дошли руки.
В этом посте поговорим о среде выполнения в Android. В частности, я постараюсь кратко, но емко изложить, чем отличается ART и Dalvik, и как со временем улучшились средства разработки в Android. Тема явно не новая, но, надеюсь, придется кстати тем, кто только начинает вникать. Кому интересно — добро пожаловать под кат.
Виртуальная машина
Сначала, давайте разберемся чем отличается JVM от DVM.
Java Virtual Machine — виртуальная машина, способная выполнять байт-код Java независимо от базовой платформы. Она опирается на принцип “Write once, run anywhere”. Байт-код Java может быть запущен на любой машине, способной поддерживать JVM.
Компилятор Java преобразует .java файлы в class-файлы (байт-код). Байт-код передается JVM, который компилирует его в машинный код для исполнения непосредственно на CPU.
- Имеет стековую архитектуру: в качестве структуры данных, куда помещаются и хранятся методы, используется стек. Он работает по схеме LIFO или “Last in — First Out” или “Последним вошел, первым вышел”.
- Может запускать только class-файлы.
- Использует JIT-компилятор.
Dalvik Virtual Machine (DVM) — виртуальная Java машина, разработанная и написанная Дэном Борнштейном (англ. Dan Bornstein) и другими, как часть мобильной платформы Android.
Можно сказать, что Dalvik — это среда для выполнения компонентов операционной системы Android и пользовательских приложений. Каждый процесс выполняется в своём, изолированном адресном пространстве. Когда пользователь запускает приложение (либо операционная система запускает один из своих компонентов), ядро виртуальной машины Dalvik (Zygote Dalvik VM) создает отдельный, защищенный процесс в общей памяти, в котором непосредственно разворачивается VM, как среда для запуска приложения. Другими словами, изнутри Android выглядит как набор виртуальных машин Dalvik, в каждой из которых исполняется приложение.
- Использует архитектуру на основе регистров: структура данных, куда помещаются методы, основана на регистрах процессора. За счет отсутствия операций POP и PUSH, команды в регистровой виртуальной машине выполняются быстрее аналогичных команд стековой виртуальной машины.
- Исполняет байт-код собственного формата: Android dexer (о нем поговорим ниже) преобразует class-файлы в формат .dex, оптимизированные для выполнения на Dalvik VM. В отличие от class-файла, dex-файл содержит сразу несколько классов.
Подробно об архитектуре DVM можно почитать тут.
Android Dexer
Разработчики Android знают, что процесс преобразования Java байткода в .dex байткод для Android Runtime является ключевым шагом в создании APK. Компилятор dex в основном работает “под капотом” в повседневной разработке приложений, но он напрямую влияет на время сборки приложения, на размер файла .dex и производительность во время выполнения.
Как уже упоминалось, сам dex-файл содержит сразу несколько классов. Повторяющиеся строки и другие константы, используемые в нескольких файлах классов, включаются только для экономии места. Байт-код Java также преобразуется в альтернативный набор команд, используемый DVM. Несжатый dex-файл обычно на несколько процентов меньше по размеру, чем сжатый архив Java (JAR), полученный из тех же файлов .class.
Изначально, class-файлы преобразовывались в dex-файлы с помощью встроенного DX-компилятора. Но начиная с Android Studio 3.1 и далее, компилятором по умолчанию стал D8. По сравнению с DX-компилятором, D8 компилирует быстрее и выводит dex-файлы меньшие по размеру, при этом обеспечивая более высокую производительность приложения во время исполнения. Полученный таким образом байт-код dex подвергается минификации с помощью open-source утилиты ProGuard. В итоге, мы получаем тот же dex-файл, но только меньше. Далее этот dex-файл используется для сборки apk и, наконец, для развертывания на устройстве Android.
Но следом за D8 в 2018 году пришел R8, который, по сути, является тем же D8, только с дополнениями.
При работе с Android Studio 3.4 и Android Gradle 3.4.0 plugin или выше, Proguard больше не используется для оптимизации кода во время компиляции. Вместо этого плагин работает по умолчанию с R8, который сам выполняет Code shrinking, Optimisation и Obfuscation. Хотя R8 предлагает только подмножество функций, предоставляемых Proguard, он позволяет совершить процесс преобразования Java байт-кода в dex-байт-код единоразово, что еще больше сокращает время сборки.
R8 и сокращение кода
Как правило, приложения используют сторонние библиотеки, такие как Jetpack, Gson, Google Play Services. Когда мы используем одну из этих библиотек, часто в приложении используется только малая часть каждой отдельной библиотеки. Без Code shrinking, весь код библиотеки сохраняется в вашем приложении.
Бывает так, что для улучшения читаемости и удобства поддержки приложения разработчики используют подробный код. Например, могут быть использованы значимые имена переменных и шаблон проектирования для того, чтобы другим было удобнее разобраться в коде. Но шаблоны, как правило, приводят к бОльшему объему кода, чем это необходимо.
В этом случае R8 приходит на помощь. Он позволяет существенно уменьшить размер приложения, оптимизируя размер даже того кода, который действительно используется приложением.
В качестве примера, ниже преведены цифры из доклада Shrinking Your App with R8, который был представлен на Android Dev Summit ’19:
А вот так выглядело сравнение эффективности R8 на этапе выпуска бета-версии (взято из источника Android Developers Blog):
Детальнее можно ознакомиться в оф документации и докладе.
ART vs DVM в Android
DVM была спроектирована именно для мобильных устройств и использовалась как виртуальная
машина для запуска андроид приложений вплоть до Android 4.4 Kitkat.
Начиная с этой версии, ART был представлен как среда выполнения, а в Android 5.0 (Lollipop) ART полностью заменил Dalvik.
Основное явное отличие ART от DVM состоит в том, что ART использует AOT компиляцию, а DVM — JIT компиляцию. Не так давно ART начал использовать гибрид AOT и JIT. Далее разберем это чуть подробнее.
- Использует JIT компиляцию: всякий раз при запуске приложения,
- компилируется та часть кода, которая необходима для выполнения приложения. Остальная часть кода компилируется динамически. Это замедляет запуск и работу приложений, но уменьшает время установки.
- Ускоряет загрузку устройства, поскольку кеш приложения создается во время выполнения.
- Приложения, работающие на DVM, требуют меньше памяти, чем те, которые работают на ART.
- Уменьшает резерв батареи, увеличивая нагрузку на CPU.
- Dalvik является “устаревшим” и не используется на андроид версиях выше 4.4.
- Использует AOT компиляцию, то есть компилирует весь код во время установки приложения. Это ускоряет запуск и работу приложений, но требует большего времени установки.
- Замедляет загрузку устройства, так как кеш создается во время первой загрузки.
- Ввиду использования подхода AOT компиляции, требует больше памяти в сравнении с приложениями на DVM.
- Увеличивает резерв батареи, сокращая работу процессора из-за отсутствия компиляции при выполнении приложений.
- Улучшенная Garbage Collection или сборка мусора. Во времена использования Dalvik, сборщики мусора должны были осуществить 2 прохода по куче (heap), что и приводило к плохому UX. В случае с ART, такой ситуации нет: он чистит кучу один раз для консолидации памяти.
И небольшая схема Dalvik vs ART:
JIT + AOT в ART
Среда выполнения Android (ART), начиная с Android 7, включает компилятор JIT с профилированием кода. JIT-компилятор дополняет AOT компилятор и повышает производительность во время выполнения, экономит место на диске и ускоряет обновления приложений и системы.
Происходит это по следующей схеме:
Вместо того, чтобы запускать AOT-компиляцию каждого приложения на этапе установки, он запускает приложение под управлением виртуальной машины, используя JIT-компилятор (почти так же, как в Android
Источник
Пять столпов Android. Технологии, лежащие в основе самой популярной ОС
Содержание статьи
Виртуальная машина
Принято считать, что в основе Android лежит Java. Дескать, именно поэтому ОС такая требовательная к процессору и оперативной памяти. На самом деле все намного сложнее. Java (а теперь и Kotlin) — это действительно официальный язык Android. Но Java — это не только язык, но и среда исполнения.
В случае обычной Java, разработанной компанией Sun (теперь уже Oracle), приложения компилируются в специальный промежуточный байт-код, который затем исполняет виртуальная машина. Самые ранние версии виртуальной машины делали это путем интерпретации: ВМ читала байт-код, анализировала записанные в нем инструкции и исполняла их.
Это медленный метод исполнения (на каждую инструкцию ВМ могли уходить десятки и сотни машинных инструкций), поэтому позднее появился так называемый JIT-компилятор (Just In Time compiler). С его помощью виртуальная машина могла на лету перегонять байт-код в машинные инструкции, что существенно подняло скорость его исполнения, но повысило расход оперативной памяти: в памяти теперь необходимо хранить не только байт-код, но и полученные из него машинные инструкции плюс метаданные, позволяющие выполнять оптимизации.
Кроме того, при разработке виртуальной машины Джеймс Гослинг решил использовать стековый дизайн виртуальной машины, как простой и универсальный. Но существует более эффективный в скорости исполнения байт-кода и потребления оперативной памяти дизайн виртуальной машины — регистровый.
Именно такая регистровая виртуальная машина (под названием Dalvik) использовалась в первых версиях Android. Благодаря отсутствию JIT-компилятора она была очень нетребовательной к оперативной памяти, а регистровый дизайн позволял исполнять приложения достаточно быстро даже в режиме интерпретации.
Среда разработки Android компилирует код Java в байт-код JVM, но затем конвертирует его в байт-код Dalvik
Однако в Android 2.2 Google все-таки реализовала JIT-компилятор и долго хвасталась графиками многократного прироста производительности. На деле же скорость возросла незначительно, все самые требовательные к ресурсам API Android и так были реализованы на C++, который исполнялся напрямую на процессоре. Почти все тяжеловесные игры также использовали код на C/C++ и других компилируемых в машинные инструкции языках.
В Android 5.0 Google пошла еще дальше и заменила Dalvik на AOT-компилятор (Ahead Of Time compiler) под названием ART. В теории такой компилятор позволяет избавиться от виртуальной машины как сущности и переводить приложение в машинные инструкции еще на этапе установки. На деле же получалось так, что не весь байт-код можно было одним махом сконвертировать в инструкции процессора, и результирующий код мог содержать как машинные инструкции, так и байт-код старого доброго Dalvik. И со всей этой мешаниной продолжала разбираться виртуальная машина.
AOT-компилятор также проигрывал JIT-компилятору в возможностях оптимизации машинного кода. У него просто не было достаточно информации о поведении приложения и особенностях его работы; ее можно было получить, только запустив приложение. И он существенно замедлял установку приложений и первый запуск операционной системы.
Чтобы это исправить, в Android 7 Google решила использовать гибридный JIT/AOT-компилятор. Сразу после установки приложение исполняется с использованием JIT-компилятора, но во время работы от зарядки смартфон перегоняет приложение в машинные инструкции с помощью AOT-компилятора, который может учитывать информацию, накопленную в процесс исполнения приложения.
А теперь вопрос: зачем Google нужны были все эти заморочки с Java и виртуальными машинами, когда можно было пойти по пути Apple и использовать обычный, компилируемый в машинные инструкции язык, который не страдает от проблем с жором оперативки и производительности?
Ответов на этот вопрос как минимум два.
Портабельность. Помнишь слоган Java: «Написано однажды — работает везде»? А ведь это не маркетинговый булшит, это чистая правда. Ты можешь скачать любое когда-либо написанное на Java приложение и запустить его на любой полноценной виртуальной машине Java независимо от операционной системы, архитектуры процессора и фазы луны. Оно просто работает.
Тем же принципом руководствовались разработчики Android. Неважно, на каком процессоре основан смартфон, неважно, смартфон это или телевизор. Приложение, написанное для Android, будет на нем работать без всяких перекомпиляций и модификаций (если, конечно, оно не использует машинный код на C/C++).
Мало того — разработчику даже не нужно задумываться о поддержке более эффективных инструкций, появившихся в новых процессорах, за него это сделает виртуальная машина.
Надежность. Java — это высокоуровневый язык со сборщиком мусора, не позволяющий адресовать память напрямую и не требующий самостоятельного освобождения выделенной памяти. Это значит, что многие типы атак, включая buffer overflow и use after free, против приложений на Java не могут быть реализованы. В крайнем случае виртуальная машина просто убьет приложение (как это нередко происходит при выходе за границы массива, например). Именно поэтому в Android в целом находят меньше уязвимостей, чем в iOS, полностью написанной на небезопасных языках C, C++ и Objective-C. И это одна из причин, почему Apple понадобился язык Swift, на котором она начала переписывать компоненты ОС и стоковые приложения.
Популярность. Java — один из самых популярных языков в мире, поэтому у Android-разработчиков изначально был доступ к огромному количеству Java-библиотек и сниппетов, кода, которые можно задействовать в приложении.
Подводя итог: Java и виртуальная машина были правильным выбором. И хотя сейчас набирает обороты язык Kotlin, он полностью совместим с Java на уровне байт-кода. А это значит, что для его поддержки на стороне ОС не нужно делать ничего. Приложения просто работают.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Евгений Зобнин
Редактор рубрики X-Mobile. По совместительству сисадмин. Большой фанат Linux, Plan 9, гаджетов и древних видеоигр.
Источник