4

ごあいさつ

メモリ マップ ファイルを介して Java オブジェクトの透過的な永続性を実現したいと考えています (OS のページング/スワッピング メカニズムを利用します)。

私の問題は次のとおりです: Java オブジェクトをメモリマップされたブロックに移動するにはどうすればよいですか? さらに、新しいオブジェクトインスタンスをそのようなブロックに強制的に配置するにはどうすればよいですか?

ご存知のように、メモリ マップド ブロックはバイト配列と見なすことができます。ここで私が実際に求めているのは、Java オブジェクトのアドレス空間をそのような配列の 1 つとオーバーラップさせる方法です。OSが永続性を透過的に処理している間(ダーティページを書き込む)、オブジェクトを介してデータを操作できるようにします。

Java でこれが許可されない場合、どのクロスプラットフォーム & ガベージ コレクション OO 言語を使用するようにアドバイスしてくれますか?

よろしくお願いします。

4

3 に答える 3

3

これを行う唯一の方法は、独自のJavaVMを使用してこの機能を追加することです。もちろん、作成するコードはJavaではなく、VMが実装されている言語です。かなり前に、Gemstoneはオブジェクトデータベースエンジンにこのアプローチを使用していました。

今日のオブジェクトデータベース(私は1つに取り組んでいます。)はこのようにはしません。バイトコードを拡張してフィールドアクセスを追跡し、リフレクションまたはインジェクトされたメソッドを使用してオブジェクトをある種のシリアル化された形式に変換する方がはるかに簡単です。これは非常に優れたパフォーマンスを発揮します。クエリをサポートする場合は、とにかく個々のフィールド値を操作してインデックスを作成する必要があります。

私たちにとって、実行したいすべてのプラットフォームのVMを維持することは不可能です。また、真面目な顧客に、(銀行の)アプリケーション全体をカスタマイズしたVMに依存するように説得することもできませんでした。

Java VMに基づくソリューションの作成に真剣に関心がある場合:「フォレスト」と呼ばれる、直交する透過的な永続性に関する興味深いJava研究プロジェクトがありました。古い論文やソースコードさえも見つけることができるかもしれません。

メモリから「オブジェクト」を直接取得するための別の言語を探している場合:C++でそれが可能になります。このアプローチを使用するC++で記述された古いオブジェクトデータベースがいくつかあります。...しかしねえ、それはクレイジーなことで、ページフォールトを使用してオブジェクトをロードします。これらの種類のオブジェクトデータベースは、悪いイメージを生み出しました。近いうちにまた好転することを願っています。

于 2010-06-17T00:48:30.173 に答える
3

これは不可能です。そして、ランタイムがこれを許可しない理由はいくつかあります。

  • オブジェクトのメモリレイアウトは、JVM内部の一部です。各JVMは、オブジェクトのレイアウト方法を独自に決定できます。このレイアウトはリリースごとに変わる可能性があります。オブジェクトをファイルにメモリマップすると、問題が発生します。オブジェクトレイアウトが変更されるとどうなりますか?クラッシュ、ファイルの更新、魔法をかけますか?最終的に、オブジェクトをファイルにメモリマッピングするには、固定オブジェクトレイアウトを指定する必要があります。
  • フィールドを追加/削除するとどうなりますか?その後、オブジェクトのレイアウトは確実に変更されました。古いメモリレイアウトでファイルをメモリマップすることはできません。
  • オブジェクトには、仮想関数呼び出しのVTable、ロック状態のフィールドなどの追加情報もあります。それらもマップしますか?それは内部ランタイム状態であるため、おそらくそうではありません。したがって、常に数バイトまたは分割されたオブジェクトを無視する必要があります。これにより、メモリレイアウトが非常に複雑になります。
  • ガベージコレクタはメモリを圧縮して、オブジェクトを移動することで断片化を最小限に抑えます。したがって、オブジェクトの「固定」メカニズムが必要です。(相互運用の理由から、.NETでは可能です)
  • ガベージコレクターは何世代にもわたって機能します。若い世代に最初に割り当てられた場合のオブジェクト。それが生き残るにつれて、それは他の世代に移されます。メモリマップドオブジェクトには例外が必要です。

これらすべての理由により、Java/.NETオブジェクトをメモリマップすることはできません。このような機能をサポートすると、JVM/CLRが非常に複雑になります。

JVM / CLRでも、バイトの書き込み/読み取りが可能な配列のような抽象化として、メモリマップトファイルにアクセスできます。これに加えて、永続性メカニズムを実装できます。単純なシリアル化から複雑なデータベースまで。透過的な永続性を提供するために非常に近いオブジェクトデータベースがあります。その場合、オブジェクトは永続的なデータ構造/メモリマップドオブジェクトのように動作します。

于 2010-06-16T18:09:33.250 に答える
1

できません。

Java は、設計上、型の安全性と参照整合性を強制します。つまり、参照型 T のフィールドがある場合、それが T のインスタンスを指していることがわかります (型消去によってヒープ汚染が発生しない限り)。これは、C++ などの「安全でない」言語とは対照的です。参照が無効な場所を指す可能性が高く、その参照が「メモリ破損」を引き起こす可能性があります。

Java が byte[] を として扱うことを許可した場合Object、そのような参照整合性は保証できません。

于 2010-06-16T18:32:59.313 に答える