Реализации 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.