問題タブ [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、オブジェクトをソフトリファレンスに変換
ソフトリファレンスを含むweakhashmapにデータオブジェクトを配置する必要があります。「Drawable」オブジェクトをソフトリファレンスに変換するにはどうすればよいですか?
tempPulledは、ソフトリファレンスである「sPulled」を配置する必要があります
java - GC が到達不能と判断した複雑な Java オブジェクトをリサイクルする方法はありますか
C++ では、参照カウント オブジェクトを使用して、「自動」リサイクル オブジェクト プールの for を実装します。
-- これで、refcount が 0 に達したときに呼び出される "onFinalRelease()" メソッドが C++ オブジェクトにあります。これをオーバーライドして (デフォルトは delete(this) です)、オブジェクトを破棄するのではなく、オブジェクトを自動リサイクルすることができます。
問題は、Java 参照型と参照プールを組み合わせてこのパターンを実装できるかどうかです。もちろん、これは意味のあるオブジェクトを作成するのにコストがかかる大規模な複雑なタイプのためのものです。それは私がやりたいことです:
これは本当にいいでしょう:)
java - Java: 強い参照、弱い参照、弱い参照、ファントム参照の違い
Java のさまざまなタイプの参照 (強い、弱い、弱い、ファントム) に関するこの記事を読みましたが、よくわかりません。
これらの参照型の違いは何ですか? また、各型はいつ使用されますか?
java - SoftReferencesは実際にはJVMによってどのように収集されますか?
JVMで実行されている2つの別々のキャッシュ(1つはサードパーティのライブラリによって制御されています)があり、それぞれがソフト参照を使用しています。ライブラリによって制御されるキャッシュよりも先に、JVMが制御されたキャッシュをクリアすることをお勧めします。SoftReferencejavadocは次のように述べています。
ソフトに到達可能なオブジェクトへのすべてのソフト参照は、仮想マシンがOutOfMemoryErrorをスローする前にクリアされていることが保証されます。それ以外の場合、ソフト参照がクリアされる時間や、さまざまなオブジェクトへのそのような参照のセットがクリアされる順序に制約はありません。ただし、仮想マシンの実装では、最近作成された、または最近使用されたソフト参照をクリアしないようにバイアスをかけることをお勧めします。
このクラスの直接インスタンスを使用して、単純なキャッシュを実装できます。このクラスまたは派生サブクラスは、より高度なキャッシュを実装するために、より大きなデータ構造で使用することもできます。ソフト参照の指示対象が強く到達可能である、つまり実際に使用されている限り、ソフト参照はクリアされません。したがって、洗練されたキャッシュは、たとえば、最近使用されたエントリがそれらのエントリへの強力な参照を保持し、残りのエントリがガベージコレクタの裁量で破棄されるようにすることで破棄されるのを防ぐことができます。
一般的なJVM実装、特にHotSpotは、実際にSoftReferencesをどのように処理しますか?仕様で推奨されているように、「最近作成された、または最近使用されたソフト参照のクリアにバイアスをかけている」のでしょうか。
android - Android でカスタム アダプターと SoftReference を使用する場合のパフォーマンスに関するアドバイス
カスタム アダプターを実装して、場所に関連する情報を表示するダイアログ ボックスを作成しました (ダイアログの各エントリは、画像、住所を表示するテキスト フィールド、都市と国を表示するテキスト フィールドで構成されます)。 ...) ViewHolder パターンを使用するほかにアダプターのメソッドを使用する SoftReference クラスを使用して、作成されたビューへの参照を保存し、OutOfMemoryError が発生する前に GC を削除できるようにします。私の目標は、より高速で効率的なキャッシュを構築することです。私のカスタムアダプターのコードの下:
私は物事を可能な限り効率的にすることに非常に興味があります。コードは私が望むものを作っていますが、SoftReference クラスをうまく利用しているかどうかはわかりません。たとえば、(LocationItemHolder) ((SoftReference ) row.getTag ()).get()という文は、メソッド getView が呼び出されるたびに目的のオブジェクトを取得するために呼び出されるメソッドの数が原因で、キャッシュが無効になると思います。また、複数のキャストが必要です。その文はキャッシュを非効率にすることができますか?. Android のアダプタのコンテキストで SoftReference を使用することをお勧めしますか?
回答ありがとうございます:D
java - 2 レベルのソフト参照オブジェクトがある場合、GC はどうするか
Javaにはソフト参照の概念があることを知っています。仮に:
1) オブジェクト A を参照するソフト参照 "sf" があります
2)オブジェクトAでは、オブジェクトBを参照する強い参照があります
3) オブジェクト A と B は他のどこにも参照されていません。
定義上、オブジェクト A とオブジェクト B はどちらも「そっと到達可能」ですよね?
次に、メモリが不足していると GC が起動します。GC がオブジェクト B をリサイクルするが、オブジェクト A をリサイクルしないということは可能でしょうか?
その場合、後で「sf」を介してオブジェクト B にアクセスする場合は、null になります。どのようにjavaがそのようなケースを回避するのですか?
Java docに説明がありません。
android - Android 2.3 以降のソフト参照
多くのビットマップをロードして 1 つの大きなビットマップを形成するアプリがあります。
これらのビットマップを適切に保存できるように、ソフト参照を使用します。Android OS < 2.3 では問題なくスクロールできます。ただし、2.3 以降になると、Android はソフト リファレンス コレクションをより積極的に使用するようになりました。これが発生するため、これらの新しい携帯電話ではアプリの動作が非常に遅くなります。
私はこれをここで文書化された問題として見ました:
http://code.google.com/p/android/issues/detail?id=20015
これを回避する良い方法を知っている人はいますか?新しい携帯電話でアプリの動作が大幅に低下するのはばかげています。助けてくれてありがとう。
java - Javaでウィークリファレンスとファントムリファレンスを使用する場合
多くの記事を読みましたが、わかりません。実際には、弱およびファントム参照をどこで使用する必要がありますか?ソフト参照-私が理解しているように、キャッシュには良い選択です。しかし、弱くて幻想的で、いつ使うべきかわかりません。それらを使用する必要がある実際のタスクの例を提供してください。
java - 到達可能性を知っているキャッシュ
最大保持容量が N のキャッシュが必要です。それ以外の場合は GC の対象となる最大 N 個のオブジェクトを保持できるようにしています。ここで、アプリケーション自体が、以前にキャッシュに追加されたオブジェクトへの N+1 の強力な参照を現在保持している場合、キャッシュにも N+1 を保持する必要があります。なんで?キャッシュは、この N+1 番目のオブジェクトがそうでない場合よりも長く収集されるのを妨げないため、より大きなハッシュ テーブルをより多くのキャッシュ ヒットと交換しても問題ありません。
別の言い方をすれば、追加されたすべてのオブジェクトを強力な到達可能性を維持しながら保持し、サイズ == N を維持するのに十分な非強力な到達可能オブジェクトも保持するオブジェクト キャッシュが必要です。
例
N=100 で作成されたキャッシュがあります。サイズは 0 から始まります。150 個のオブジェクトが追加され、サイズは 150 になります。これらのオブジェクトの 100 個は、強く到達できなくなります (弱く、柔らかく、何でも)。キャッシュはそれらのうち 50 個を削除し、50 個を保持します。サイズは 100 です。さらに 49 個の強力に到達可能なオブジェクトが追加されます。サイズは 100 のままですが、そのうちの 99 個が強く到達可能であり、1 つだけが強く到達可能ではありません。何が起こったのかというと、49 の古い、強く到達できないオブジェクトが新しい 49 に置き換えられたのです。新しいオブジェクトは強く到達可能だからです。
動機
実際には、多くのユースケースで直感的に必要なことだと思います。通常、キャッシュの容量は、キャッシュ ヒット確率と引き換えに最大メモリ使用量を保証します。キャッシュが保持するオブジェクトの到達可能性を認識していれば、キャッシュは、最大メモリ使用量の保証を変更することなく、より高いキャッシュ ヒット確率を提供できます。
トラブル
JVMではできないのではないかと心配しています。私は別のことを言われることを望んでいますが、事実が不可能であることがわかっている場合は、根拠があればその答えも受け入れます.
java - ReferenceQueue で弱い参照またはソフト参照を使用する場合、オブジェクトが実際にメモリから削除されるのはいつですか?
弱参照またはソフト参照を使用するReferenceQueue
場合、オブジェクトが実際にメモリから削除されるのはいつですか? referancequeue.remove
または referancequeue.poll()
メソッドを呼び出す必要がありますか?
例:
またはフォローする必要がありますか?