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

Какая разница между внутренней работой Java JVM и .NET CLR?

Какая разница между внутренней работой Java JVM и .NET CLR?

Возможно, отправной точкой будет то, что они в основном одно и то же в их соответствующих средах (Java > JVM > Машинный код) (С# > CLR > IL).


Обновление: Несколько человек ссылались на те пункты, которые я пытался описать:

  • Коллекция мусора
  • Бокс/распаковка
  • Отладка JIT
  • Дженерики/Шаблоны
  • Пожалуйста, не стесняйтесь предлагать другие хорошие темы, которые различают два.

@George Mauer - это звучит очень интересно:

Уже опубликовано это раз, но вот серия интервью с главным дизайнером языка С# Андерсом Хейлсбергом.

4b9b3361

Ответ 1

Уже опубликовано это раз, но вот серия интервью с главным дизайнером языка С# Андерсом Хейлсбергом. Хотя в основном говорят о различиях между С# и Java, он также погружается в различия между виртуальными машинами.

Ответ 2

Это должен быть отличный поток.

Одно из самых больших различий между CLR и JVM - это встроенная интеграция генерических средств CLR.

Java вместо этого удаляет общие типы, и JVM может работать только с объектами, автоматически создавая объекты, которые, по-видимому, являются псевдо-дженериками.

Ответ 3

От здесь. Я не мог бы сказать это лучше (ну, за исключением пламенной войны, это беспламенное место:-)).

Здравствуйте,

Ответ на ваш вопрос кажется чреватый опасностью, запустив пламя войны, поэтому я буду действовать осторожно.

Существует ряд фундаментальных технического сходства между Java Runtime и общий язык Время выполнения, включая сбор мусора память, промежуточный язык (Microsoft IL против Java ByteCode), основных системных библиотек и поддержки языки довольно высокого уровня, код безопасности и развертывания.

Однако каждая из этих "похожих" областей также имеют ряд значительных и небольшие различия, а сфера простого сообщения форума описать большинство из них.

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

Ответ 4

Одно существенное отличие состоит в том, что JVM переносится на разных платформах и работает на Linux, Macintosh и многих мобильных телефонах и встроенных устройствах.

CLR работает на поддерживаемых Microsoft платформах, а проект Mono обеспечивает частичную поддержку более старых версий CLR еще на несколько.

Внутри это означает, что производительность JVM будет варьироваться в зависимости от разных платформ на основе возможностей, предоставляемых самими платформами.

Ответ 5

CLR и JVM имеют цели и философию, которые отличаются друг от друга, чем вы думаете. В целом, JVM стремится оптимизировать более динамичный, более высокий уровень кода, в то время как CLR предоставляет вам более низкоуровневые инструменты для самостоятельного выполнения этих видов оптимизации.

Хорошим примером является распределение стека. В CLR у вас есть явное распределение стека пользовательских типов значений. На JVM единственными настраиваемыми типами являются ссылочные типы, но JVM может преобразовывать выделение кучи в распределение стека в определенных обстоятельствах через Escape Analysis.

Другой пример. В Java методы по умолчанию являются виртуальными. На С#, по крайней мере, это не так. Гораздо сложнее оптимизировать вызовы виртуальных методов, потому что код, который запускается на данном сайте вызова, не может быть определен статически.

Под капотом их системы исполнения совершенно разные. Большинство JVM (в частности, Hotspot) начинаются с интерпретатора байт-кода и только JIT-компилируемые части кода, которые выполняются в значительной степени, например. плотные петли. Они также могут повторно компилировать их каждый раз, используя статистику выполнения, собранную из предыдущих прогонов, для оптимизации дисков. Это позволяет использовать больше усилий по оптимизации для тех частей программы, которые в ней больше всего нуждаются. Это называется адаптивной оптимизацией.

CLR собирает все фронт только один раз. Это уменьшает оптимизацию, потому что у него больше кода для компиляции, поэтому он должен быть быстрым и потому, что он не имеет статистических данных о фактических путях выполнения, принятых для его оптимизации. Этот подход имеет очень важное преимущество, позволяя вам кэшировать результаты компиляции в процессах, которые CLR делает, но JVM этого не делает.

Значительная часть JVM-кода Hotspot предназначена для этих адаптивных оптимизаций, и именно они помещают Java в один и тот же рабочий стол как собственный код для большинства вычислений общего назначения в начале 2000-х годов. Они также делают JVM достойной мишенью для динамических языков. Я исключаю здесь последние разработки динамического языка Runtime и invokedynamic, поскольку я не знаю достаточно о DLR.

Ответ 6

Мигель де Икаса упоминает здесь:

Опытные отраслевые программисты заметят, что приведенное выше очень похож на Java и Java VM. Они правы, выше как Java.

В CIL есть одна функция, которая не найдена на Java: представление байтового кода, которое достаточно мощно для использования в качестве target для многих языков: от С++, C, Fortran и Eiffel до Lispи Haskell, включая такие вещи, как Java, С#, JavaScript и Visual Базовый в миксе.

Я хотел бы, чтобы у меня было время, чтобы пойти более подробно, но ради меня этого аргумента, приведенного выше будет достаточно.

В комментариях содержатся некоторые детали, например, как оптимизация хвостовых вызовов. Лоты изменились с 2002 года, хотя - как CLR, так и JVM теперь имеют несколько языков, ориентированных на него. Но тем не менее стоит прочитать.

Ответ 7

Как сказал Vinko, полная информация выходит за рамки форума. Различия/сходства сводятся к следующему:

Они представляют собой среду с песком, которая включает в себя компилятор "точно в срок" для перевода программных команд на промежуточном языке (MSIL или ByteCode) на собственный машинный код и обеспечивает автоматическое управление памятью (сбор мусора). Сидеть над соответствующими средами исполнения - это набор библиотек классов, которые предоставляют разработчикам более высокие абстракции для упрощения задач разработки.

Внутренности того, как эти среды выполнения фактически реализованы, по большей части являются собственностью Microsoft и Sun. Алгоритмы, используемые системами сбора мусора, например, хотя, вероятно, аналогичны по технической функциональности, различны в реализации.

Ответ 8

Насколько мне известно,.NET CLR по-прежнему обладает гораздо более гибкой и мощной защитой кода доступа, встроенной в среду выполнения, позволяя значительно более мелкие разрешения и политику выполнения.

Ответ 9

Существуют также различия в сборе мусора. JVM использует Копировальный коллектор, а также Mark и sweep. Пользователь .NET Копирование коллектора и маркировка и компактность (гораздо сложнее реализовать).

Также важно удалить стирание, упомянутое Flyswat. JVM не имеет понятия о дженериках, и все это объект и связанный с ним перфект. штраф за бокс и распаковку. Также отражение не даст вам общей информации. CLR поддерживает дженерики изначально.