問題タブ [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のReferenceQueueを使用する
SoftReference
インスタンス変数として作成された場合にWeakReference
のみ役立ちますか?メソッドスコープでそれらを使用することに何か利点はありますか?
他の大きな部分はReferenceQueue
です。どの参照がガベージと判断されたかを追跡できることに加えてReference.enqueue()
、ガベージコレクションのオブジェクトを強制的に登録するために使用できますか?
たとえば、オブジェクト内の(強力な参照によって保持されている)重いメモリリソースを使用するメソッドを作成し、それらをキューに入れるための参照を作成することは価値がありますか?
(この場合のObjectは、大量のメモリを使用するオブジェクトタイプを表していると想像してください...などBufferedImage
)
これは現実的な効果がありますか?それとも、これは単なるコードの無駄ですか?
android - AndroidアプリでSoft/WeakReferenceクラスを使用するにはどうすればよいですか?
膨大な数の画像を含む大きなアプリを維持しています。私の主な問題は、メモリエラーが発生するため、使用するとアプリがクラッシュすることです。SoftReferencesとWeakReferencesを使用しようとしています。これについては読みましたが、GridView、BaseAdapter、ImageViewなどのAndroidクラスで使用する必要があるかどうかわかりません。
私のアプリには、上部にギャラリーがあるマーカー付きのマップアクティビティがあります。バルーンをクリックすると、グリッドビューで2番目のアクティビティが表示されます。
最初のアクティビティでは、マップを移動すると、アクティビティはギャラリー内のすべてのマーカーと画像を再読み込みし、新しいマーカーと画像を追加します。次の属性があります。
ShotButton shotButton; ギャラリーギャラリー; 画像を一覧表示します。プライベートImageViewmMyLocationImage;
私の質問は、マップを移動したり、アクティビティを破棄または一時停止したりするときに、メモリを解放するためにソフト/弱参照クラスで新しいことをしなければならないということです。soft / weakreferenceクラスで新しい属性を追加する必要がありますか?たとえば、GalleryAdapterをsoft / weakReferenceクラスに追加する必要がありますか、システムがこのメモリを解放しますか?
2番目のアクティビティには、ユーザーのすべての画像を含むグリッドビューがあります。アクティビティに入るときにすべてのデータをロードし、アクティビティが必要なときに画像をロードします。このアクティビティには次のようなものがあります。
ImageLoader_Profileは、画像のロードを管理します。
この場合、私がする必要があるのはそれだけですか、それともソフト参照で何か他のことをしなければなりませんか?私は少し混乱しています。
java - Javaでマップサイズが正しくありません。キーと値をWeakReferenceでラップしてから、HashMapに追加すると、印刷サイズが予想と異なります。
1行目と2行目をコメントしないと、1行目でOutOfMemoryErrorが発生します。逆の場合、<Key、Value>はWeakReferenceでラップされているため、OutOfMemoryErrorは発生しません。しかし、3行目の出力がわかりません---- i : 3869 Size : 3870 maxSize : 3870
。
Javaドキュメントから:
ガベージコレクタはいつでもキーを破棄する可能性があるため、WeakHashMapは、不明なスレッドがサイレントにエントリを削除しているように動作する可能性があります。
このステートメントに基づくと、サイズは減少するはずですが、3行目の出力は継続的に増加しているようです。なぜそうなのか ?
android - FragmentStatePagerAdapter -Android を使用した方向変更時のフラグメントの弱参照
フラグメントへの弱い参照を使用して、fragmentstatepageradapter でフラグメントを追跡しています。実際のフラグメントを追跡するためにベクターを作成するよりも安価であることがわかりました。したがって、たとえば getFragmentt(2) という関数を呼び出すと、weakreferences のリストでフラグメントが検索され、生きている場合は実際のオブジェクトが返されます。これまでのところすべて順調です。デバイスを回転させると、fragmentManager はフラグメントを再作成しますが、その結果、弱参照はすべて失われます。向きの変更でフラグメントが再作成されている場合でも、アダプターは呼び出されません。これがコードです。
java - 既存のすべてのアイテムにアクセスできるキャッシュ
オブジェクト(この質問の目的のために、それらは不変です)が要求オブジェクト(URLまたはaと同じくらい単純である可能性があります)に基づいて作成されるシステムを持っていますlong
。ではなく、ファクトリ メソッドで作成されnew
ます。
リクエストのオブジェクトがすでに存在する場合、代わりに既存のインスタンスへの参照を取得できれば、新しいオブジェクトのリクエストがより効率的に行われます。
UniversalCache<K, V>
その目的のために、現時点でより良い名前がないことを求めるクラスを作成しました。LruCache
X個の強参照が保持されるようにするため、およびシステムHashMap<K, SoftReference<V> >
内の他の強参照を介してまだ生きている可能性のあるすべてのオブジェクトを追跡するために(SoftReference
オブジェクトがGCにならないようにすることに依存していません'd)。
まだキャッシュにない新しいオブジェクトが作成されると、そのオブジェクトはそのキーとともにキャッシュに追加されます。キャッシュ内で検索するには、キーを使用して参照を取得し、オブジェクトへの参照がまだあるかどうかを確認します。
私が抱えている問題は、オブジェクトがガベージ コレクションされたら、これらのキー/参照のペアを削除する方法です。which returnsHashMap
の参照を検索する全体を調べたくありません。参照対象は常に利用できるとは限らないため、それを使用してキー バックを取得または生成することはできません。そのため、キーを保存し、それを使用して からペアを削除するように拡張しています。これは良い考えですか?キーにキャッシュと同じタイプの追加フィールドを持つ があります(最終的には と同じになります)。poll
null
SoftReference
HashMap
KeyedSoftReference<K,Rt>
K
Rt
V
特に、 を処理する場所ReferenceQueue
(現時点では にget
あります) と、 から取得したオブジェクトをキャストする方法についてアドバイスをお願いしますReferenceQueue.poll()
。
これは私が今まで持っているコードです:
java - Java SoftReference 保証の失敗
JDK 7 のドキュメントには、次のように書かれていますSoftReference
。
「ソフト到達可能なオブジェクトへのすべてのソフト参照は、仮想マシンが OutOfMemoryError をスローする前にクリアされていることが保証されています。」
ただし、私のテスト プログラムでは、OutOfMemoryError
一貫して表示されます (以下の「見知らぬ人の行動」セクションを除く)。
出力は次のとおりです。
見知らぬ人の行動
非常に奇妙なのは、try-catch ブロックを元に戻すと、プログラムが永遠に正常に動作しているように見え、「Referent still alive.」と出力されることです。疲れて殺すまでセリフ。
このすべてで何が欠けていますか?
java - キーと値の両方にソフト参照を使用したキャッシュの実装
キーと値がソフト参照であるキャッシュを実装したいと考えています。キャッシュに含まれるインスタンスの計算 (特に値) に時間がかかる可能性があり、参照されていないオブジェクトをキーまたは値として含むエントリが必要なためです。メモリが不足する可能性がある場合にのみ、ガベージコレクションを取得します。値に弱い参照を使用すると、参照されなくなるとすぐにガベージ コレクションが実行されますが、これは私がやりたいことではありません。
最初は、この例を使用しました。それは機能しますが、キャッシュインスタンスごとに単一のスレッドを作成するのは私を悩ませます.キーの強力な参照を使用し、キャッシュクラスのいくつかのメソッド呼び出しで自分で古いエントリを消去します(WeakHashMapのように)実行するリスクがある場合は(明らかに)機能しませんそれらを呼び出さないとメモリ不足になります。Guava を使用したかったのですが、MapMaker では論理的なソフト キーの使用が許可されなくなりました。これは、デフォルトの等価性が equals() メソッドではなく等価 (==) に基づいているため、同一のキーを再作成することは不可能であることを意味します。ただし、sebastien-lorber のコメントには同意します。
GuavaがSoftReferenceのequalsメソッドをオーバーライドしていれば、ソフトキーは理にかなっていると思います。Guava が「等価メカニズム」を使用していることを見てきましたが、ソフト参照の場合、defaultEquivalence はそのような場合を処理するために同一ではなく等値であるべきだと思います。
MapDB と JCS も調べました。
上で引用した例を変更したり、グアバを使用してソフト参照に基づいてキャッシュを作成したりするにはどうすればよいですか?