Подтвердить что ты не робот

Каковы различия в JIT между Java и .Net

Я знаю, что Microsoft.NET использует CLR как JIT-компилятор, в то время как Java имеет Hotspot. Каковы различия между ними?

4b9b3361

Ответ 1

Они очень разные звери. Как указывали люди, CLR компилируется в машинный код, прежде чем он выполнит часть MSIL. Это позволяет в дополнение к типичному исключению мертвого кода и встраивать оптимизацию приватов, чтобы использовать преимущества конкретной архитектуры процессора целевой машины (хотя я не уверен, что она это делает). Это также наносит удар по каждому классу (хотя компилятор довольно быстр, и многие библиотеки платформ являются тонким слоем поверх API Win32).

В HotSpot VM используется другой подход. В нем оговаривается, что большая часть кода выполняется редко, поэтому не стоит тратить время на его компиляцию. Все байт-коды начинаются в интерпретируемом режиме. VM хранит статистику на сайтах и ​​пытается идентифицировать методы, которые называются более чем предопределенным числом раз. Затем он компилирует только эти методы с быстрым компилятором JIT (C1) и меняет метод во время его работы (что особый соус HS). После того, как скомпилированный метод C1 был вызван еще несколько раз, тот же метод скомпилирован с использованием медленного, но сложного компилятора, и код снова заменяется на лету.

Так как HotSpot может менять методы во время их работы, компиляторы VM могут выполнять некоторые спекулятивные оптимизации, которые небезопасны в статически скомпилированном коде. Канонический пример - статическая отправка/вложение мономорфных вызовов (полиморфный метод только с одной реализацией). Это делается, если VM видит, что этот метод всегда разрешает одну и ту же цель. То, что раньше было сложным вызовом, сводилось к нескольким защитникам инструкций процессора, которые прогнозируются и конвейерно обрабатываются современными процессорами. Когда состояние охраны перестает быть истинным, виртуальная машина может использовать другой путь кода или даже вернуться в режим интерпретации. На основе статистики и рабочей нагрузки программы сгенерированный машинный код может отличаться в разное время. Многие из этих оптимизаций основаны на информации, собранной во время выполнения программы, и невозможны, если вы скомпилируете один раз, когда вы загружаете класс.

Вот почему вам нужно разогреть JVM и эмулировать реалистичную рабочую нагрузку, когда вы тестируете алгоритмы (искаженные данные могут привести к нереалистичной оценке оптимизаций). Другие оптимизации - это блокировка, адаптивная блокировка спина, анализ побега и распределение стека и т.д.

Тем не менее, HotSpot является только одной из виртуальных машин. JRockit, Azul, IBM J9 и Resettable RVM, - все имеют разные профили производительности.