2012-01-22 6 views
4

私は、httpでの高速アクセスのためにメモリに画像データ(jpgs、pngs、tiffなど)をキャッシュするキャッシュサーバーをJavaで作成しています。イメージは、高価な操作である別のサービスによってレンダリングされるので、キャッシュサーバーにキャッシュします。Javaと仮想メモリ:どのオブジェクトがメインメモリに保持されているかの制御/影響?

あり、私は最初からそれを書いている理由はいくつかあるので、私が探している答えは、[いくつかの巧妙なソフトウェア製品]

質問ではありません。私は、データの特定のセットを維持することができますどのようにメインメモリ内のオブジェクトを削除し、必要なときにデータがメインメモリに実際に存在することを確認し、仮想メモリマネージャによってディスクにプッシュされないようにします。つまり、私はどのようにJavaでこれを行うことができますか?

詳細情報:オブジェクトは任意の間隔で参照できます。 または少し極端:-)する年離れてを言う

EDIT:私は尋ねた。このSO postを発見した「あなたは連続したメモリ内のオブジェクトを保持することができますか?」 - これは私が求めている質問ではありませんが、オブジェクトが常に参照されていれば助けになると思います。そして、btw、その質問への答えは、明らかに配列の値の型を除いて、 "いいえ"でした。

+0

「イメージが高価な操作で別のサービスによってレンダリングされたので、私は私のキャッシュサーバ上にキャッシュしたいです。」 *何が高価な操作ですか?レンダリング、ネットワーク転送、またはディスクアクセス?キャッシュサーバが遠隔からアクセスされる場合、例えば、 HTTP経由でのキャッシュは、ボトルネックではないディスクアクセスを回避するのに役立ちます。 –

+0

あなたの実装は、既存のキャッシュライブラリ/フレームワーク/システム/アプリケーションのどれがそうしないでしょうか? –

+0

CPUに関しては高価です。 –

答えて

1

私は、あなただけがJavaでこれを行うことができると強く疑っています。おそらく、JNIを通じてmlockのようなものを使用しなければならないでしょう。また、キャッシュされたオブジェクトグラフをメモリに固定してGCがそれらを移動させないようにするために必要なJNI命題を使用する必要があります。そして[ここに奇跡を挿入]これは、mlockが動作するので、固定されたメモリを連続したページに圧縮するためです。

+0

+1。私はmlockに慣れていません(そしてJNIにはあまりよく知られていません)。私はmlockはLinuxだけのものだと思いますか? –

+0

Linux + BSD + Mac。 Windowsの場合、別の方法が必要です(残念なことに?)私はWindowsのサポートも必要です。 –

+0

奇跡部分について:複数のイメージのバイトを1バイト配列に配置し、mlockを使用してこの(おそらく連続した)データをメモリに固定し、別の(メモリ常駐の)データ構造のバイト配列にインデックスを保持する? –

1

は、私はあなたがページングを避けたいので、予想通りの低アクセス時間を維持したいと仮定します。 Javaでは、メモリを管理するためのツールが非常に限られています。実際、これは、どのページが非アクティブでディスクにプッシュできるかを追跡するためのオペレーティングシステムの仕事です。私は、主要なオペレーティングシステムにこの動作を制御するためのAPIがあるかどうかもわかりません。彼らは本当に長い時間のために使用されなかった

は言われていること、あなたは、ページが実際に必要なシステムをだますことに集中しなければなりません。私はあなたがすでに答えを知っていると思う - ちょうど毎秒あなたのキャッシュのすべてのオブジェクトに触れる非同期タスクを書く。これにより、オペレーティングシステムは、プロセスがまだこれらのメモリ領域を積極的に使用していると信じるはずです。

悲しいですが効果があるはずです。

+0

+1 "触るオブジェクト"アプローチ。それはいい考えですが、もちろん保証はありません。私はそれを保証するためにOS APIコールを探していると思います。それが助けになるかどうかを調べるためにアプローチしていくことができます。 –

+0

ところで、私はあなたの答えを受け入れたものとして選ぶことができました。それは分割された髪の決定だった。 –

+0

@PiminKonstantinKefaloukos:私は助けてくれると嬉しいです、幸運! :-) –

関連する問題