問題タブ [soft-references]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java: HttpSession で ArrayList への SoftReference を保持することの問題/マイナス面はありますか?
私のコードは次のことを行っています (例として、java.lang.ref.SoftReference へのパッケージ パスを指定する理由は、それが私自身の実装ではないことに注意するためです:-):
以降:
欠点はありますか?見えないのはどれですか?ありがとうございました!
java - SoftReference を使用するコードのテスト
のコードをSoftReference<T>
完全にテストするには、「はい、無効になっています」というケースをテストする方法を考え出す必要があります。「テスト用」コードパスを使用して参照を強制的にnullにすることで、これを多かれ少なかれモックすることができますが、GCが行うようにキューを正確に管理することはできません。GCが実際に収集と無効化を誘発する、再現可能で制御された環境を設定する経験を誰かが共有できるのだろうか?
c++ - C++ でのソフト (ない: 弱い) 参照 - 可能ですか? 実装はありますか?
C++ では、不要になったオブジェクトを自動的に削除するためにboost::shared_ptr
andを使用しています。boost::weak_ptr
これらは参照カウントで機能することを知っています。
Java では、メモリはガベージ コレクターによって管理されます。ガベージ コレクターは、組み込みのオブジェクト参照を strong 、 weak 、およびその中間のものと見なします( GCによって収集される可能性がありますが、GC を生き残ることもできます)。これは非常に便利です。しばらくの間オブジェクトをキャッシュしますが、空きメモリが少なくなるとすぐにオブジェクトを破棄します。WeakReference
SoftReference
だから今、私は C++ に戻っており、ソフト参照を持つ快適さが恋しいです。参照カウントでソフト参照が実際に実行可能かどうか疑問に思います。オブジェクトへの最後の強参照がクリアされ、ソフト参照が残っている場合、それはいつ削除されるのでしょうか? いくつかの計画を思いつくことができましたが、どれも賢いとは思えません。
参照カウントに加えてソフト参照の適切なセマンティクスがある場合に備えて、これは既に実装されているのではないかと思います。おそらく互換性のある方法でboost::shared_ptr
(または C++ TR1 に相当std::shared_ptr
します)。
両方の質問に対する答えが「いいえ」の場合、オブジェクト キャッシング シナリオの代替手段は何ですか?
編集: もちろん、オブジェクトを構築するのにコストがかかるため(データベースへの複数のアクセスとネットワークのクエリを考えてください)、キャッシングが実際に役立つ状況について話していますが、それらをすべて永久に保持するには多すぎます。
java - Javaの参照クラスを理解する:SoftReference、WeakReference、およびPhantomReference
誰かが3つのリファレンスクラスの違いを説明できますか(または素敵な説明へのリンクを投稿できますか)?SoftReference
>> 、しかし、私はいつそれぞれを使用しますかWeakReference
?PhantomReference
なぜあるのにWeakHashMap
ないのSoftHashMap
かPhantomHashMap
?
そして、次のコードを使用すると...
...何が起こるのですか?ref
すべてのステートメントの前にnullかどうかを確認する必要がありますか(これは間違っていますが、どうすればよいですか)?急いで質問して申し訳ありませんが、これらのReference
クラスを理解するのに苦労しています...ありがとう!
java - Javaシステムでソフト参照をリリースするにはどうすればよいですか?
SoftReference ベースのキャッシュを使用します (それ自体は非常に単純です)。しかし、テストを書いているときに問題に遭遇しました。
このテストの目的は、メモリのクリーンアップが発生した後、キャッシュが以前にキャッシュされたオブジェクトをサーバーから再度要求するかどうかを確認することです。
ここで、ソフト参照オブジェクトを解放するシステムを作成する方法の問題を見つけます。メモリが少なくなるまでソフト参照は解放されないため、System.gc()を呼び出すだけでは不十分です。この単体テストは PC で実行しているため、VM のメモリ バジェットはかなり大きくなる可能性があります。
================== 後ほど追記 ==============================
回答してくださった皆様、ありがとうございました!
すべての長所と短所を検討した後、 nandaとjarnbjoのアドバイスに従って、力ずくで行くことにしました。ただし、JVM はそれほど愚かではないように見えます。VM のメモリ バジェットを単独で超えるブロックを要求しても、ガベージ コレクションを試みません。そこで、次のようにコードを修正しました。
.net - .NET にはソフト参照がありますか?
重複の可能性:
Java のように、.NET に SoftReference と WeakReference がないのはなぜですか?
Java にはいくつかのタイプの参照があり、そのうちの 2 つはWeakとSoftです。.NET には弱い参照があることは知っていますが、弱い参照もありますか?
(ソフト参照は、強い参照が存在しない場合でもオブジェクトを存続させようとするという点で、弱い参照よりも強力です。ただし、メモリが不足している場合は解放します。)
java - GCはSoftReferenceとWeakReferenceによって参照されるオブジェクトを収集しますか?
MaptoSoftReferencesから構築されたキャッシュがあります。それらが追加されると、それらは別のキューに入れられ、gzipなどを介して遅延圧縮されます。私の考えは次のとおりです。圧縮キュー内のオブジェクトへのWeakReferencesが必要です。これにより、コンプレッサータスクがオブジェクトに到達したときに、オブジェクトが既になくなっている場合は、わざわざ圧縮する必要がなくなります。また、コンプレッサーのキューはオブジェクトを圧縮しません。 t他の方法ではGCされるオブジェクトを存続させます。
では、SoftReferenceが1つとWeakReferenceが1つしかない場合でも、SoftReferenceのセマンティクスは適用されますか?
android - Android:GCはSoftReferencesを尊重しませんか?
DalvikのガベージコレクターはSoftReferencesを尊重せず、WeakReferencesと同様に、できるだけ早くそれらを削除します。まだ100%確信はありませんが、まだ最大3MBの空きメモリがあるにもかかわらず、LogCatに「GCがbla-bla-blaバイトを解放しました」と表示された後、SoftReferencesがクリアされます。
また、ここでマーク・マーフィーのコメントを見ました:
少なくとも1.5の時間枠では、Androidでは機能しないことを除いて。GCSoftReferenceのバグが修正されたかどうかはわかりません。SoftReferencesは、このバグですぐにGCされます。
それは本当ですか?SoftReferencesは尊重されていませんか?
これを回避する方法は?
java - Java でライトバック キャッシュを実装する
ライトバック キャッシュを実装しようとしています。ソフト参照を使用しようとしていますが、参照が gcQueue に追加される前にクリアされ、参照対象オブジェクトにアクセスできないため、事後ライトバックの実行に問題があります。
ソリューション?
java - これはソフト参照を使用する正しい方法ですか
しばらく前にソフト参照を使用してキャッシュを作成しましたが、バグを解決しようとすると、実際には間違って実行され、必要のないときにオブジェクトが削除されるのではないかと心配しています。これは私がそれをした方法です:
つまり、呼び出しプロセスは、キーの合計によって識別/検索できる新しいバッファリングされたオブジェクトを追加できます。このバッファリングされたオブジェクトが少なくとも1つのオブジェクトによって使用されている限り、マップから削除されることはありませんが、オブジェクトによって使用されなくなった場合、メモリが不足するとガベージコレクションになる可能性があります。
しかし、今私のコードを見ることが重要なことは、キーフィールドの合計が常にどこか別の場所で参照されていることです(必ずしもそうではありません)。
編集:それで私はコリンの解決策を試しましたが、putIfAbsent()が付加価値を返さないようであるため、私はちょっと困惑しています。addImageメソッドを変更してデバッグを取得しました
戻り値
したがって、Bufferedインスタンスが最初から存在せず、正常に構築および追加されたことを明確に示していますが、putIfAbsentによって返される必要がありますか?