Позволяет на секунду игнорировать наивное предположение, что вы можете легко обобщить этот вопрос для нескольких виртуальных машин.Любая попытка создать механизм, подобный этому, будет сильно зависеть от деталей реализации виртуальной машины, для которой вы создавали механизм.
Вот несколько причин, почему это не сделано:
Представление в ядре, как правило, не переносимо между архитектурами.Если бы я отправлял «объект» с ВМ на машине SPARC на ВМ на компьютере с архитектурой x86, не зная его структуры, объект был бы поврежден с другой стороны.
Объект не обязательно должен существовать в одной и той же ячейке памяти на обеих машинах, поэтому внутренние указатели внутри объекта необходимо будет исправить после того, как он достигнет второй виртуальной машины.Это также требует внутреннего знания структуры объекта.
Объект, вероятно, содержит ссылки на другие объекты, поэтому копирование объекта означает копирование дерева объектов и, как правило, не ациклического дерева.Вы в конечном итоге создаете код, который очень похож на библиотеку сериализации, чтобы сделать это надежно.
Объекты часто держатся за собственные ресурсы (такие как дескрипторы файлов и сокеты), которые могут 'надежно передаваться между компьютерами.
Во многих виртуальных машинах существует различие между данными (объект, который вы пытаетесь скопировать) и метаданными (например, классомобъект, который вы пытаетесь скопировать).В таких виртуальных машинах, даже если вы можете копировать объект за битом в целости и сохранности, это может зависеть от набора метаданных, которых нет на удаленном конце.Копирование метаданных побитно также сложно, так как многие виртуальные машины используют методы реализации (такие как глобальный пул встроенных строк или объектный код с отображением в памяти), которые делают данные по своей природе непереносимыми.Вы также можете получить гораздо больше метаданных, чем вам нужно (например, в .net самая маленькая единица метаданных, которую вы можете упаковать и отправить куда-либо, обычно является сборкой).
In-представление ядра, как правило, не переносимо между различными версиями одной и той же виртуальной машины и не содержит внутренней информации о версии, которая может использоваться для исправления данных.
Представление в ядре содержит множествовещи (например, встроенные кэши, информация о сборке мусора), которые не нужно копировать.Копирование этого материала было бы бесполезным, а информация, возможно, даже не была бы разумной с другой стороны.
В принципе, чтобы сделать это надежно, вы в конечном итоге создадите самую неловкую и ненадежную сериализацию в миребиблиотека, и прирост производительности простой копии памяти теряется при исправлении многих вещей, которые ломаются, когда вы делаете копию наивно.
Таким образом, эти механизмы, как правило, не существуют.
Существует одно огромное исключение из этого правила: виртуальные машины на основе образов (например, множество виртуальных машин smalltalk и self) построены на идее о том, что состояние виртуальной машины существует в «образе», который можно копировать, перемещать между машинами и т. Д.как правило, имеет значительные эксплуатационные расходы.