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

StackOverflow https://stackoverflow.com/questions/611134

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top