2009-03-25 11 views
7

私はオブジェクトのキャッシュのようなコレクションを実装しようとしています。その目的は、一度に複数のオブジェクトを読み込んでいる可能性が高いので、メモリ内の局所性を介してこれらのオブジェクトにすばやくアクセスできるようにすることです。私は現在、vectorやdequeのようなJavaコレクションオブジェクトにオブジェクトを格納するだけです。しかし、私はこれが連続した記憶を利用しているとは思わない。Javaオブジェクトを連続したメモリに格納しようとしています

これはC言語で行うことができますが、Javaで行うことができますか?これらのオブジェクトは長さが異なる場合があります(文字列を含む可能性があるため)。 Javaを介して連続したメモリを割り当てる方法はありますか? Javaコレクションオブジェクトはありますか?

お知らせください。

おかげで、あなたはそれを強制することはできません JBU

+2

連続メモリに何が格納されますか? –

+2

検索が高速で、ページフォールトが少ない – jbu

+0

これはプロファイリングによって表示されていますか? –

答えて

14

。すべてのオブジェクトをすばやく連続して割り当てると、となる可能性があります。は連続していますが、コレクションに格納する場合、コレクションが実際の値に対してローカルになるという保証はありません。 (コレクションにはオブジェクト自体が含まれているのではなく、オブジェクトへの参照が含まれます)。

さらに、GC圧縮は値をメモリ内で移動します。

あなたのアプリを実際にプロファイリングしたが、これがボトルネックであることが判明しましたか?ほとんどの場合、私は他の最適化がより信頼できる方法であなたを助けることができると思います。

+1

ええ、まずそれをプロファイルして、壊れていないものを修正する時間を無駄にしないようにします。 –

+0

私はそれを2番目にします。これが本当にあなたのアプリのボトルネックになっているのであれば、間違った言語で書いている可能性があります。 –

4

このコードはまだJavaで書かれていますか?もしそうなら、あなたはそれをプロファイリングしましたか?私は、おそらく、オブジェクトが連続したメモリにあることを心配する必要はないと主張します。JVMはガベージコレクション環境よりもメモリ管理が優れています。

パフォーマンスに本当に関心がある人は、Javaがその仕事のための適切なツールではないかもしれませんが、私の本能は、あなたが最適化が早すぎることを心配しています。非連続メモリで動作するコードは、おそらくあなたのニーズに合っています。

+0

あなたが正しいです、最適化は正しい実装とプロファイリングの後に来るべきです。私は先を考えようとしていました。それはまだJava理論の教訓として役立つが。 – jbu

8

いいえ、この地域の参照は保証できません。

nioパッケージのバイト配列を割り当てたり、マップされたバイトバッファを使用したりすることで、連続したメモリが得られます。このデータから、必要なデータをデコードすることができます。メモリ)。ただし、同じオブジェクトに繰り返しアクセスすると、デシリアライゼーションのオーバーヘッドが目的を破る可能性があります。

+0

それはプリミティブの配列が連続したメモリに格納されているが、オブジェクトの配列には格納されていないように聞こえる。あれは正しいですか? – jbu

+1

配列は連続していますが、Foo []などの配列を持つ場合は、Foo *の配列*であり、Foo *のオブジェクト*ではありません。 Javaにはユーザー定義の値型はありません。 –

-1

キャッシュにHashMap(スレッドなし)またはHashtable(スレッド化)を使用することをお勧めします。両方ともsun jvmの配列にオブジェクトを格納します。 javaのすべてのオブジェクトは参照によって渡されるので、これはcのポインタの配列として表現されるべきです。私はあなたが時期尚早の最適化を実行しているということです。

あなたは絶対にこれを持っている必要がある場合、あなたは2つのオプションがあります。

1)を使用JNIとCでそれを書きます。 2)BIGバイトバッファを取得し、ObjectOutputStreamを使用してオブジェクトに書き込みます。これは、ハッシュテーブルを使用する場合と比較して、非常に遅い可能性があります。

+1

オブジェクトは参照渡しされません。参照(および他のすべての引数も)は値渡しです。大きな違いがあり、正確な価値があります。