- - PR -
Javaで共有メモリの使用について
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2004-09-12 16:13
UniX−Cのように、Javaで共有メモリって使用できますか?
頻繁にアクセスされるテーブルだけを共有メモリで持ちたいのですが、 どうすればいいのか困ってます。 | ||||
|
投稿日時: 2004-09-12 16:44
Unix-Cのような共有メモリっていったい何でしょうか?
グローバル変数のこと?? だとしたら static なフィールドを利用するのはどうでしょうか? 下記の例のように、static で宣言した map は すべての Hoge インスタンスから参照されます。 class Hoge { private static java.util.Map map = new java.util.HashMap(); } | ||||
|
投稿日時: 2004-09-12 18:52
JavaからOSのAPIを呼び出せるなら、できるでしょうが、無理では?
staticですると、そのアプリケーション内では共有できますが、他のアプリケーションとの共有はできない・・・ですよね? | ||||
|
投稿日時: 2004-09-12 18:55
複数プロセス間でメモリを共有したいってことですか? そういうのは知らないですねえ。 もしどうしてもやりたいとしたら、JNI使ってネイティブな 共有メモリのコードを呼び出すのかな? JavaHouse-Brewersで検索したところ、こんな感じでした。 どうやら、共有メモリのようなものは無さそうですね。 ローカルでも、RMI使うしか無さそう(つまりソケット通信)。 | ||||
|
投稿日時: 2004-09-12 18:57
JNIって手はありますよね。 各プラットフォームごとにバイナリを用意する必要があるので、 Write Once, Run Anywhereな観点からはあまり宜しくありませんが。 | ||||
|
投稿日時: 2004-09-12 19:46
「System V IPC」の共有メモリ、だと、そういった物が(たぶん)ないのと、
共有メモリの更新を伝えるには別の方法(System V IPCならセマフォ?)も 必要になりますね。 「メモリマップドファイル」を流用するなら、J2SE 1.4 の MappedByteBuffer (FileInputStream -> FileChannel 経由で作成)で できるかも知れません。 が、こちらもできたとしてもバッファの更新を伝える方法がわかんない。 (ありそうな気もしますが、追求してないです) バッファの参照側でビジーループ回すわけにも行かないし、 Socketで通知するって手もあるでしょうが。 | ||||
|
投稿日時: 2004-09-13 00:58
みなさん色々とご提案ありがとうございます。
色々考えてみたのですが、 メモリに置きたいテーブルのデータを、 クラス変数でもって、クラスローダをSharedでロードすれば解決しそうに思いました。 おそらく、Unixの共有メモリを使用するのと同じようなことができるように思いました。 今度のミーティングの時にでも提案してみたいと思います。 | ||||
|
投稿日時: 2004-09-14 00:18
これって、プロセス間でのメモリ共有、という目標を達成できているんでしょうか? JavaプログラムはJVMというプロセス上で動きますから、プロセス間=JVM間ということに なりますよ。 複数のJVM間でメモリを共有するのが目標、というわけではないのでしょうか?? Sharedクラスローダって、もしかしてTomcatの話ですか? | ||||
1
