-
Подход
C/C++
:- Исходный код -> машинный код -> процессор
-
Подход
Java
- Исходный код -> компилятор -> байткод виртуальной машины -> виртуальная машина -> процессор
Зачем это всё
- Кроссплатформенность. То есть программа, которую мы написали работает одинаково под разными платформами (в отличии от
C/C++
). Это как раз и обеспечивает виртуальная машина.
Just in Time
компиляция позволяет делать оптимизации в runtime, потому что мы знаем значения переменных и т.д.
// Just-In-Time компиляция позволит сомтимизировать это просто до y += n, если, например x <= 0.
for (int i = 0; i < n; i++) {
if (x > 0) {
...
}
else {
y += 1;
}
}
- В результате
Java 7
всего в 1.5-2 раза медленнееC
, а на некоторых тестах даже быстрее.
-
Память
-
Подход
C/C++
: -
Выделил память -> поработал -> почистил память.
-
Подход
Java
- Выделил память -> поработал -> забыл
Как найти объекты, до которых не можем добраться:
- Запускаем
dfs
со стеков и статической памяти - то, до чего не можем добраться - можно чистить. - Помимо этого считаем ссылки на объекты.
-
-
Безопасность
- Верификация байткода
- Автоматическое управление памятью
- нет арифметики указателей
- невозможно испортить память
-
Заложена отличная многопоточность
-
JRE (Java Runtime Environment)
- нужна для запуска уже скомпилированных программ -
JDK (Java Development Kit)
- инструменты разработчика(компилятор), включает в себяJRE
-
На
Java
виртуальной машине можно запускать программы на любом языке, который компилирует в байт-кодJVM
.Groovy
Kotlin
Scala
Jython
Oracle Java
Open JDK
- много много ещё