Виртуальная машина Java и среда CLR

Как своего рода продолжение вопроса под названием Различия между байт-кодом MSIL и Java?, в чем (основные) различия или сходства в том, как работает виртуальная машина Java, и в том, как работает среда CLR (Common Language Runtime) .NET Framework?

Кроме того, является ли среда CLR .NET Framework «виртуальной машиной» или у нее нет атрибутов виртуальной машины?

Что ж, если вы сравниваете подобное и подобное, вам следует перефразировать вопрос как разницу между виртуальной машиной и CLR (Common Language Runtime), которая является прямым аналогом виртуальной машины.

cletus 17.01.2009 20:11
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
143
2
42 964
4

Ответы 4

CLR и JVM являются виртуальными машинами.

.NET Framework и среда выполнения Java представляют собой объединение соответствующих виртуальных машин и их библиотек. Без библиотек виртуальные машины бесполезны.

Это не виртуальная машина, .NET framework компилирует сборки в собственный двоичный код во время первого запуска:

В вычислениях JIT-компиляция, также известная как динамическая трансляция, представляет собой метод повышения производительности компьютерной программы во время выполнения. JIT основывается на двух предыдущих идеях в средах выполнения: компиляция байт-кода и динамическая компиляция. Он преобразует код во время выполнения перед его выполнением изначально, например, байт-код в собственный машинный код. Повышение производительности по сравнению с интерпретаторами связано с кэшированием результатов преобразования блоков кода, а не просто с переоценкой каждой строки или операнда каждый раз, когда она встречается (см. «Интерпретируемый язык»). Он также имеет преимущества перед статической компиляцией кода во время разработки, поскольку может перекомпилировать код, если это окажется полезным, и может обеспечить гарантии безопасности. Таким образом, JIT может сочетать некоторые преимущества интерпретации и статической (опережающей) компиляции.

Некоторые современные среды выполнения, такие как Microsoft .NET Framework, большинство реализаций Java и совсем недавно ActionScript 3, полагаются на JIT-компиляцию для высокоскоростного выполнения кода.

Источник: http://en.wikipedia.org/wiki/Just-in-time_compilation

Добавление .NET framework содержит виртуальную машину, как и Java.

Тот факт, что виртуальная машина использует JIT для оптимизации производительности, не означает, что это больше не виртуальная машина. Когда программист компилирует, он компилирует в виртуальную машину, оставляя реализацию для выполнения выполнения, как она считает нужным.

Allain Lalonde 17.01.2009 21:47

Ваш первый вопрос - это сравнение JVM с .NET Framework - я полагаю, вы действительно хотели вместо этого сравнить с CLR. Если так, я думаю, вы могли бы написать небольшую книгу об этом (Обновлено: похоже, что у Бенджи уже есть :-)

Одно важное отличие состоит в том, что среда CLR разработана как независимая от языка архитектура, в отличие от JVM.

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

Чтобы ответить на ваш второй вопрос, термин «виртуальная машина» - это более старый термин из мира оборудования (например, виртуализация IBM 360 в 1960-х годах), который означал программную / аппаратную эмуляцию базовой машины для выполнения такого же рода то, что делает VMWare.

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

Итак, педантичный ответ на ваш второй вопрос - «нет». Но на самом деле все сводится к тому, как вы определяете эти два термина.

Обновлено: Еще одно различие между JVM и CLR состоит в том, что JVM (версия 6) - это очень неохотно, чтобы освободить выделенную память обратно операционной системе, даже если это возможно.

Например, предположим, что процесс JVM запускается и изначально выделяет 25 МБ памяти из операционной системы. Затем код приложения пытается выделить ресурсы, требующие дополнительных 50 МБ. JVM выделит дополнительные 50 МБ из операционной системы. После того, как код приложения перестанет использовать эту память, он будет обработан сборщиком мусора, и размер кучи JVM уменьшится. Однако JVM будет освобождать выделенную память операционной системы только при определенном очень специфические обстоятельства. В противном случае в течение оставшейся части времени существования процесса эта память останется выделенной.

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

Абсолютно неправильно, что JVM не освобождает выделенную память. См. Мой ответ на этот вопрос в качестве доказательства: stackoverflow.com/questions/366658/…

Michael Borgwardt 28.01.2009 01:59

Я видел, как JVM возвращает память обратно в Windows.

Steve Kuo 28.01.2009 02:09

Я изменил свой ответ, сказав, что JVM 6 очень неохотно освобождает память, со ссылками на ответы Рана и Майкла. Я никогда не видел такого поведения с JVM 5, так что, возможно, эта версия была еще более неохотной.

HTTP 410 29.01.2009 14:18

Не могли бы вы рассказать, как JVM активно управляет кучей, в то время как CLR полагается на родительский процесс? В конкретном примере, который я использую, JVM имеет аргументы времени выполнения для максимального размера кучи, в то время как среда CLR по умолчанию - нет. Хотя верно, что приложение CLR, размещенное в IIS, может настроить IIS для ограничения памяти, это будет означать включение IIS в определение виртуальной машины.

Kelly S. French 11.10.2011 18:26

@ Стив Куо, да, я тоже это видел. обычно с 17:00 до 18:00.

Simple Fellow 20.06.2019 08:50

Более подробную информацию о различиях можно найти в различных академических и частных источниках. Когда-то хороший пример - Варианты дизайна CLR.

Вот некоторые конкретные примеры:

  • Некоторые операнды нижнего уровня имеют типизированный тип, например «добавить два целых», где, поскольку CLR использует полиморфный операнд. (т.е. fadd / iadd / ladd vs просто добавить)
  • В настоящее время JVM выполняет более агрессивное профилирование и оптимизацию во время выполнения (например, Hotspot). В настоящее время CLR выполняет оптимизацию JIT, но не оптимизацию времени выполнения (т. Е. Заменяет код во время работы).
  • CLR не встраивает виртуальные методы, JVM делает ...
  • Поддержка типов значений в CLR помимо «примитивов».

Другие вопросы по теме