Каковы некоторые фундаментальные особенности / архитектурные различия между BEAM и JVM? - PullRequest
14 голосов
/ 17 февраля 2010

Каковы некоторые фундаментальные особенности / архитектурные различия между BEAM и JVM?

  1. Да, я знаю: один изначально был построен на Java, а другой - на эрланге
  2. Я понимаю JVM (несколько) и хочу сравнить их структуры
  3. Например, я знаю, что у JVM есть один глобальный GC, а у BEAM - один на процесс

Ответы [ 2 ]

17 голосов
/ 17 февраля 2010

Прежде всего, Beam - это машина регистрации, а не машина стека. Как и WAM для Prolog, он использует «X-регистры», которые являются обычными регистрами (реализованы как массив в C), и «Y-регистры», которые являются именами слотов в записи активации локальной функции («кадр вызова») в стеке. Нет инструкций по работе со стеком.

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

В BEAM есть инструкция для уменьшения «счетчика сокращений» для процесса и принятия решения о том, пора ли уступить, чтобы запустить другой процесс. С другой стороны, у JVM есть инструкции по синхронизации потоков.

Одним из важных отличий является то, что в BEAM есть инструкции хвостового вызова, которых нет в JVM.

Наконец, как для BEAM, так и для JVM, набор команд, используемый в объектных файлах, действительно является только транспортным форматом. Эмулятор BEAM переписывает инструкции из файла во внутреннюю версию со многими оптимизированными инструкциями для особых случаев (которые могут меняться от одного выпуска к другому). Кроме того, вы можете скомпилировать в собственный код. Большинство JVM делают то же самое.

1 голос
/ 10 апреля 2018

Некоторые другие интересные моменты:

  1. Процессы являются гражданами BEAM и управляются самой ВМ, в то время как JVM передает их управление ОС. Это позволяет BEAM очень быстро управлять (создавать, удалять, переключать контексты, ...) и, таким образом, иметь возможность управлять сотнями тысяч процессов по сравнению с несколькими сотнями потоков Java на подходящей машине.

  2. В BEAM межпроцессное взаимодействие основано на обмене сообщениями, который устраняет большинство, если не все ситуации, которые могут привести к состоянию гонки. На Java вам нужно синхронизировать потоки, что сложно и подвержено ошибкам.

  3. Одним из важных моментов является то, что сборка мусора выполняется в BEAM для каждого процесса, в то время как это глобальный процесс в JVM. Влияние заключается в том, что GC на JVM может заморозить всю виртуальную машину на несколько секунд, в то время как на BEAM каждый процесс должен передать некоторые из своих операций (сокращений) GC без влияния на другие процессы.

В последнее время некоторые новые библиотеки, такие как VertX (я действительно не знаю, Akka , но я верю, что это так) для языков JVM начали реализовывать аналогичные процессы поведения, чтобы попытаться решить вопросы 1. и 2. Я полагаю, что проблема GC не может быть легко решена с помощью библиотеки.

...