17

状態をファイルに保存し、その状態を再読み込みできる Java VM はありますか?

もしそうなら、どれですか?

4

11 に答える 11

12

あなたのケースに関連する場合と関連しない場合がある別のオプションは、仮想マシン内で JVM (任意の JVM) を実行することです。ほとんどの仮想マシンには、状態を保存して再開するオプションが用意されているため、PC を再起動し、VM が復旧したときに VM を起動して、Java プロセスが元の場所から再開できるようにする必要があります。

仕事中の IE でのテストに VMWare Player を使用しています。これは、IE を閉じてから再度開くと、上記のように機能します。通常、アプリが VM で何か注目すべきことを行っているときはこれを行いませんが、外部リソース (ネットワーク ソケットなど) にアクセスしていない限り、VM がシャットダウンされていないかのように動作することを期待します。 .

于 2009-01-08T16:56:23.227 に答える
5

継続はおそらくあなたが探しているものです:

[...] ファースト クラスの継続。これは、プログラミング言語に、任意の時点で実行状態を保存し、プログラムの後の時点でその時点に戻る機能を与える構成体です。

Java には少なくとも 2 つの継続ライブラリがあります: RIFE continuationsjavaflowです。私は、javaflowが少なくとも状態をディスクにシリアライズできることを知っています:

キャプチャしたContinuationすべてのオブジェクトがシリアライズ可能である場合、 をシリアライズできます。つまり、すべてのローカル変数 (すべてのthis オブジェクトを含む) を としてマークする必要があります Serializable。この例では、 MyRunnable クラスを Serializable としてマークする必要があります。シリアル化された継続は、別のマシンに送信したり、後で使用したりできます。- Javaflow チュートリアル

于 2009-03-10T10:51:37.343 に答える
4

別の JVM ランタイムでデシリアライズできる、関連するドメイン固有のオブジェクトをシリアライズする必要があります。

JVM全体を永続化するツールについては知りません。これに最も近いのは、 gcoreを使用して実行中の JVM プロセスからコア ダンプを作成し、次にjsadebugdjmapまたはjstackを使用してデバッグすることでした。

例えば:

$ jps # get JVM process ID XXX
$ gcore -o core XXX
$ jsadebugd $JAVA_HOME/bin/java core.XXX

アップデート

アーキテクチャ間で移植可能なソリューションはまだ見つからないと思います。

于 2009-01-08T15:50:40.253 に答える
4

状態を保存できる JVM については知りません。正確なニーズに応じて、Terracotta の使用を検討できます。Terracotta は基本的に、JVM 間でヒープ状態を共有し、この状態をディスクに保存できます。

これは、アプリケーションをクラスター化したり、ヒープステートを永続化したりするために使用できます。実際には、これを使用して JVM を開始し、中断したところから再開することができます。詳細については、http: //www.infoq.com/articles/open-terracotta-introをご覧ください。

お役に立てれば。

于 2009-03-09T14:50:22.070 に答える
4

多くのオブジェクトは Java コンテキスト外の状態を持っているため、シリアル化できないことに注意してください。例: ソケット、スレッド、オープン ファイル、データベース接続。このため、有用なアプリケーションの状態を一般的な方法で保存することは困難です。

于 2009-03-06T21:18:11.663 に答える
3

Sun は、「Java 言語仕様で定義された完全な計算モデルの永続性」を提供する「直交永続性」についていくつかの調査を行いました。

http://research.sun.com/forest/COM.Sun.Labs.Forest.doc.opjspec.abs.html

PJama はプロトタイプ実装です。

http://research.sun.com/forest/opj.main.html

于 2009-03-07T19:56:15.657 に答える
3

私は、このアプローチを使用して迅速に起動する組み込み Java プロジェクトに取り組んできました。JVM は Wind River のもので、VxWorks 上で実行されます。

于 2009-01-08T16:30:04.293 に答える
2

その後何も起こらなかったかのように、スナップショットが保存された場所から再開できるようにしたいと考えています。

そのような機能が壊れるフレームワークコンポーネントとライブラリがいくつあるのだろうか。突然、ストレージから JVM 状態を復活させようとしています。その間、時計は不思議なことに 23 時間早送りされ、ネットワーク接続は有効ではなくなり、GUI オブジェクトには基盤となる O/S ハンドルがなくなりました...これは自明ではなく、一般的なケースではそれなしでは不可能だと思います。フレームワークを大幅に変更します。

于 2009-03-11T11:38:02.887 に答える
2

私の知る限り、JVM の状態をキャプチャして復元するものは何もありませんが、人々は Thread クラスをシリアル化/逆シリアル化して同様のことを達成しようとしています。私が見つけた実用的な実装に最も近いものはBrakesでしたが、「スレッドのシリアル化」をグーグルで検索すると、さらに多くのことが見つかるかもしれません。

于 2009-03-06T21:05:59.647 に答える
1

現時点での答えはノーです。オペレーティング システムや VMWare などのように「休止状態」にできる JVM はありません。

アプリの複雑さによっては、プログラムを閉じるときに状態をシリアル化してシリアル化するだけで、途中まで到達できますが、閉じてから続行するときにビジネスロジックの実行を一時停止するなどのことはできません。もう一度開くと。

于 2009-03-11T19:47:46.750 に答える
1

メモリ内オブジェクトの状態を保存するだけで済む場合は、 Prevaylorのようなものがうまくいくかもしれません。ビジネス オブジェクトへのジャーナリング変更とシリアル化されたスナップショットを組み合わせて使用​​して、オブジェクトの状態を記録し、後で再ロードできます。

ただし、完全な JVM 状態 (コール スタック、GC ステータスなど) は保存されません。そのレベルの詳細が本当に必要な場合は、専用の JVM が必要になる場合があります。

于 2009-03-09T00:44:20.277 に答える