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

Может ли JVM обеспечить сохранение моментальных снимков?

Можно ли сбросить изображение запущенной JVM и позже восстановить предыдущее состояние, загрузив изображение в JVM? Я уверен, что ответ отрицательный, но хотел бы ошибаться.

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

4b9b3361

Ответ 1

Там был JSR 323, предложенный для этого, но он был отвергнута. Вы можете найти некоторые ссылки в этих статьях об исследованиях, стоящих за этим и о том, что потребуется. Это было в основном отвергнуто как идея, которая была слишком незрелой.

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

Ближайшая вещь, которую вы можете получить сегодня, - Terracotta, которая позволяет группировать часть вашей кучи JVM, сохраняя ее в серверный массив, который можно сделать постоянным. При запуске JVM вы подключаетесь к кластеру и можете продолжать использовать любые части вашей кучи, заданные как кластерные. Фактические объекты повреждаются по мере необходимости.

Ответ 2

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

Также изображения запущенных JVM, вероятно, довольно велики - возможно, намного больше, чем подмножество состояния, которое вас действительно интересует. Поэтому это не очень хорошая идея с точки зрения производительности.

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

Ответ 3

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