状態をファイルに保存してからその状態をリロードできるJava VMはありますか?
-
05-07-2019 - |
質問
状態をファイルに保存してからその状態をリロードできるJava VMはありますか?
もしそうなら、どれですか?
解決
別のオプションは、場合によっては関連する場合と関連しない場合がありますが、仮想マシン内でJVM(任意のJVM)を実行することです。ほとんどの仮想マシンには、状態を保存および再開するオプションがあります。そのため、PCを再起動し、VMが再起動したときにVMを起動して、Javaプロセスを元の場所から取得する必要があります。
私は職場でのIEでのテストにVMWare Playerを使用していますが、これを閉じて後で再度開くと、上記のように動作します。アプリがVMで何か重要なことをしているときは、通常これを行いませんが、外部リソース(ネットワークソケットなど)にアクセスしていない限り、VMがシャットダウンされなかったかのように動作するはずです。 。
他のヒント
継続はおそらくあなたが探しているものです:
[...]ファーストクラスの継続、構成体 プログラミング言語に 実行状態を保存する機能 任意のポイントとそのポイントに戻ります プログラムの後半。
Javaには少なくとも2つの継続ライブラリがあります: RIFE継続および javaflow 。 javaflowは少なくともディスクへの状態のシリアル化を許可することを知っています:
A
Continuation
は、次の場合にシリアル化できます。 キャプチャしたすべてのオブジェクトも シリアライズ可能。言い換えれば、すべての ローカル変数(すべてのthis
オブジェクト)としてマークする必要がありますシリアル化可能
。この例では、あなたは MyRunnableクラスをマークする必要があります シリアライズ可能。シリアル化された 継続はに送信することができます 別のマシンまたは後で使用。 - Javaflowチュートリアル
別のJVMランタイムで逆シリアル化できる関連ドメイン固有オブジェクトをシリアル化する必要があります。
JVM全体を永続化するツールはありません。これに最も近い方法は、 gcore 、次にを使用jsadebugd 、 jmap または jstack でデバッグします。
たとえば:
$ jps # get JVM process ID XXX
$ gcore -o core XXX
$ jsadebugd $JAVA_HOME/bin/java core.XXX
更新
まだアーキテクチャ間で移植可能なソリューションを見つけるとは思わない。
多くのオブジェクトはJavaコンテキスト外の状態にあるため、シリアル化できないことに注意してください。 例えばソケット、スレッド、オープンファイル、データベース接続。 このため、便利なアプリケーションの状態を一般的な方法で保存することは困難です。
状態を保存できるJVMを知りません。正確なニーズに応じて、Terracottaの使用を検討できます。 Terracottaは基本的にJVMの間でヒープ状態を共有し、この状態をディスクに保存できます。
これは、アプリケーションのクラスタ化やヒープ状態の永続化に使用できます。実際には、これを使用してJVMを起動し、中断したところから再開できます。詳細については、以下をご覧ください。 http://www.infoq.com/articles/open-terracotta-intro
これがお役に立てば幸いです。
組み込みJavaプロジェクトに取り組んでいます。迅速に起動するこのアプローチ。 JVMはVxWorks上で実行されているWind Riverのものでした。
Sunは、「直交永続性」に関するいくつかの研究を行っています。これは、「Java言語仕様によって定義された完全な計算モデルの永続性を提供します」:
http://research.sun .com / forest / COM.Sun.Labs.Forest.doc.opjspec.abs.html
PJamaはプロトタイプ実装です:
私が知る限り、JVMの状態をキャプチャして復元するものはありませんが、人々はThreadクラスをシリアライズ/デシリアライズして、同様のことを実現しようとしています。私が見つけた実際の実装に最も近いのは、ブレーキでした。 、ただし、「スレッドのシリアル化」をグーグルで検索すると、さらに多くの情報が見つかる場合があります。
その後、何も起こらなかったかのように、スナップショットが保存された場所から再開できるようにしたいと考えています。
このような機能が壊れるフレームワークコンポーネントとライブラリはいくつあるのでしょうか。突然、ストレージからJVMの状態が復活します。その間、時計は23時間前に不思議なことに早送りされ、ネットワーク接続は無効になり、GUIオブジェクトには基本的なO / Sハンドルがなくなりました。フレームワークを大幅に変更します。
メモリ内オブジェクトの状態を保存するだけで済む場合、 Prevaylor のようなものあなたのために働くかもしれません。ビジネスオブジェクトに対するジャーナリングの変更と、シリアル化されたスナップショットの組み合わせを使用して、オブジェクトの状態を記録します。これは後で再読み込みできます。
ただし、JVMの完全な状態(コールスタック、GCステータスなど)は保存されません。そのレベルの詳細が本当に必要な場合は、専用のJVMが必要になる場合があります。
現時点での答えはいいえです。オペレーティングシステムやVMWareなどのように「休止状態」にできるJVMはありません。
プログラムが閉じたときに状態をシリアル化して元に戻すことで、アプリの複雑さに応じて途中で取得できますが、一時停止のようなことはできません閉じたときにいくつかのビジネスロジックを実行し、再度開いたときに続行します。