1

SoftReference非効率にならない限り、できるだけ多くのメモリを使用して s を使用してキャッシュを書きたいと考えています。

オブジェクトのサイズを計算するか、使用済みメモリの近似値を取得して、使用済みサイズを推定しようとしていますJVMが、行き止まりです。

SoftReferencejavadoc には、 s がメモリ対応キャッシュに適しているとさえ記載されていますが、JVM実装がSoftReferences をどのように処理するかについての厳格な規則はありません。私はJVM(バージョン6.22以上およびバージョン7)のOracle実装についてのみ話しています。

さて、私の質問(部分的、グループ化、または好きな方法で自由に答えてください):

  1. JVMオブジェクトの最後のアクセスを考慮して、古いものだけを削除しますか? Javadoc は次のように述べています。Virtual machine implementations are, however, encouraged to bias against clearing recently-created or recently-used soft references.
  2. メモリが不足するとどうなりますか? パニックになり、JVMすべてのオブジェクトを食べるだけですか?
  3. JVM生き残るために必要なだけ食べて ( OOMEs なし)、健康に生きるように (CPU に だけを実行させない)GCように指示するパラメータはありますか?
4

3 に答える 3

1

注文はないと思います。(イベントの順番はわかりませんが)

しかし、ソフト参照では、メモリ不足の例外が発生する前に解放されることが常に保証されます。それらを指すハードリファレンスがない限り。

ただし、それらにアクセスしようとすると、それらがなくなっている可能性があることに注意する必要があります。私の推測では、ガベージ コレクターは、操作に必要な量に適合する最初のソフト参照を食べるだけです。

于 2011-10-15T14:02:33.390 に答える
0

SoftReferences は優れた機能ですが、個人的には、他のすべてのコンポーネントのメモリ要件がわからない大規模なプロジェクトではあえて使用しません。メモリを大量に消費する SoftReference キャッシュは、他の部分のパフォーマンスを低下させますか?

SoftReferences を使用する代わりに、EHCacheの使用を検討します。これにより、特定のキャッシュのサイズをエントリ数、さらにはメモリ内で使用されるバイト数で制限できます (これは、次期バージョン 2.5 の新機能です)。もちろん、LRU など、さまざまなエビクション戦略を構成できます。EHCache で設定できることはたくさんあります。

Spring を使用している場合、バージョン 3.1 は @Cachable メソッドレベルの優れたアノテーションも提供します。そこでは EHCache をキャッシングの実装として使用できます。

于 2011-10-15T17:11:16.903 に答える
0

メモリが不足するとどうなりますか? JVM がパニックになり、すべてのオブジェクトを食べるだけですか?

私は、Oracle 1.6 JVM ではこれが当てはまらないことを知っています。同時要求を処理するサーバーが、ソフト参照内に実際のデータを含む応答を使用する状況を認識しています。メモリ不足の状況が 1 つのスレッドによって報告されると、他のスレッドのソフト参照がその内容 (参照されるオブジェクト) を保持し続けることを観察しました。

生き残るために(OOMEなしで)、健康に生きるために(CPUにGCのみを実行させることなく)食べるだけにするようにJVMに指示するパラメータはありますか?

生き残るのに十分なものは何ですか?X の量のメモリが必要な場合、X が使用可能になるまでソフト参照のみを再利用するということですか? そのような調整パラメーターは見つかりませんでしたが、先ほど言ったように、JVM はソフト参照を再利用する必要があるときに、すべてのソフト参照を再利用しているようには見えません。

于 2011-10-15T17:11:37.450 に答える