Ответ 1
Реализации JVM могут различаться в том, как они реализуют компиляцию JIT, оптимизацию, сборку мусора, поддерживаемые платформы, версию поддерживаемой Java и т.д. Все они должны соответствовать набору функций и поведения, чтобы они правильно выполняли ваши байт-коды Java.
Как вы уже отметили, основное различие, как правило, заключается в лицензировании. Другие нетехнические различия, как правило, находятся в вариантах бесплатной/платной поддержки, интеграции с другими технологиями (обычно это серверы J2EE) и доступа к исходному коду.
Примечание. Хотя J2EE-сервер работает на JVM, некоторые серверы имеют встроенные инструменты для мониторинга, анализа и настройки производительности JVM.
Что касается технических различий, то за эти годы они стали менее значительными. Когда-то IBM и JRockit JVM имели гораздо более высокую производительность для эталонной реализации Sun. Это было связано с существенными различиями в типах оптимизации времени выполнения, различиях в сборе мусора и различиях в собственном коде (и в том, как использует собственный класс для разных классов). Эти различия в производительности не так важны.
Некоторые JVM также включают или интегрируются с инструментами диагностики и мониторинга. JRockit включает в себя набор инструментов для мониторинга производительности JVM. Sun предоставляет различные инструменты на основе JMX с перекрывающимися функциями, чтобы сделать то же самое. IBM Websphere когда-то включала в себя аналогичный набор инструментов для всего своего сервера приложений J2EE (не уверен, что они все еще делают, но я бы предположил, что все еще верно)...
Некоторые из JVM с открытым исходным кодом имеют тенденцию к снижению производительности, поскольку они были переработаны с нуля. Таким образом, у них есть немного больше возможностей догнать. Последнее, что я проверил около 2 лет назад, Blackdown был значительно медленнее (1.5x-2x?), Чем Sun JVM. Это также немного отставало от поддерживаемых версий Java.