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




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 для оптимизации производительности, не означает, что это больше не виртуальная машина. Когда программист компилирует, он компилирует в виртуальную машину, оставляя реализацию для выполнения выполнения, как она считает нужным.
Ваш первый вопрос - это сравнение 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/…
Я видел, как JVM возвращает память обратно в Windows.
Я изменил свой ответ, сказав, что JVM 6 очень неохотно освобождает память, со ссылками на ответы Рана и Майкла. Я никогда не видел такого поведения с JVM 5, так что, возможно, эта версия была еще более неохотной.
Не могли бы вы рассказать, как JVM активно управляет кучей, в то время как CLR полагается на родительский процесс? В конкретном примере, который я использую, JVM имеет аргументы времени выполнения для максимального размера кучи, в то время как среда CLR по умолчанию - нет. Хотя верно, что приложение CLR, размещенное в IIS, может настроить IIS для ограничения памяти, это будет означать включение IIS в определение виртуальной машины.
@ Стив Куо, да, я тоже это видел. обычно с 17:00 до 18:00.
Более подробную информацию о различиях можно найти в различных академических и частных источниках. Когда-то хороший пример - Варианты дизайна CLR.
Вот некоторые конкретные примеры:
Что ж, если вы сравниваете подобное и подобное, вам следует перефразировать вопрос как разницу между виртуальной машиной и CLR (Common Language Runtime), которая является прямым аналогом виртуальной машины.