問題タブ [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.

0 投票する
1 に答える
3339 参照

java - 参照キューに関するファントム参照と弱参照の理解

リンクhttps://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.htmlに従って、PhantomReferencesはオブジェクトがメモリから物理的に削除された場合にのみキューに入れられ、WeakReferencesはファイナライズまたはガベージ コレクションが行われる前にキューに入れられます。実際に起こりました。

違いは、エンキューが発生する正確なタイミングにあります。WeakReferences は、それらが指すオブジェクトが弱く到達可能になるとすぐにキューに入れられます。これは、ファイナライズまたはガベージ コレクションが実際に行われる前です。理論的には、オブジェクトは非正統的な finalize() メソッドによって「復活」することさえできますが、WeakReference は無効なままになります。PhantomReferences は、オブジェクトがメモリから物理的に削除された場合にのみキューに登録され、get() メソッドは常に null を返します。これは、ほとんど死んでいるオブジェクトを「復活」させることができないようにするためです。

一方、http://www.ibm.com/developerworks/library/j-refs/に従って、ヒープ オブジェクトが解放される前にPhantomReferenceReferenceQueue追加され、ファイナライズまたはガベージ コレクションの後にWeakReferencesがその ReferenceQueue に追加されます。

ソフト参照や弱参照とは異なり、PhantomReference は、ヒープ オブジェクトが解放される前に ReferenceQueue に追加されます。(すべての PhantomReference オブジェクトは、関連する ReferenceQueue を使用して作成する必要があることに注意してください。) これにより、ヒープ オブジェクトが再利用される前にアクションを実行できます。

ヒープ オブジェクトの finalize() メソッドが実行され、そのメモリが解放されると、WeakReference オブジェクトがその ReferenceQueue に追加されます (存在する場合)。

私は混乱しています。どちらが正しいですか?

基本的に、参照キューに関して弱い参照とファントム参照の違いを知りたいですか?

0 投票する
2 に答える
3050 参照

java - MapでのSoftReferenceの使用?

レガシー プロジェクトでの LRU キャッシュの実装を以下に示します。このプロジェクトではSoftReference 、キー オブジェクトではなく値オブジェクトの使用について質問があります。

ここに実装があります

アプリケーションが OutOfMemory(OOM) に到達しようとしている場合、GC はソフト到達可能なオブジェクトのメモリを再利用します。同じロジックを適用すると、値のメモリのみを再利用する必要があります (ソフト参照は値オブジェクトに対してのみ作成されるため)。
しかし、ここにファイルの先頭にあるコメントがあります

私の質問は、アプリが OOM に到達すると、対応するキー オブジェクトがマップからどのように削除されるかです。キーもソフト参照でラップするべきではありませんか?

0 投票する
1 に答える
194 参照

android - Android: アクティビティへのソフト参照

InputMethodManager は、破棄されたアクティビティへのソフト参照を保持しています。以下は、私の HPROF ダンプ ヒストグラムです。

  • android.view.inputmethod.InputMethodManager$ControlledInputConnectionWrapper @ 0x43b7f768 ネイティブ スタック
  • mInputConnection java.lang.ref.SoftReference @ 0x42b51da0
  • com.android.internal.widget.EditableInputConnection @ 0x43b7f738
  • mTextView、mTargetView android.support.v7.internal.widget.TintEditText @
  • mClipExMgr android.sec.clipboard.ClipboardExManager @ 0x434ee190
  • マイアクティビティ

おそらくEditTextです。アクティビティの onDestroy で、ビューのリスナーも削除する必要がありますか? それとも、これを無視する必要がありますか?

0 投票する
1 に答える
899 参照

python - Numpy 配列を使用してソフト参照またはポインターのようなオブジェクトを作成する方法はありますか?

多くの異なる配列から1つの配列にデータを参照する方法があるかどうか疑問に思っていましたが、それをコピーすることはありませんでした。

例:

ただし、上記の例でcは、 は新しい配列であるため、aまたはの一部の要素を変更してもb、 ではまったく変更されませんc

c(つまりc[0]、など)の各インデックスがとc[1]の両方の各要素を参照することを望みますが、ポインタのように、データの を作成しません。abdeepcopy

0 投票する
1 に答える
1577 参照

android - Android でソフト参照が期待どおりに動作しない

Android でソフト参照を使用しているときに奇妙な問題が発生しました。ビットマップ キャッシュ用のクラスを実装しました。ソース コードは次のとおりです。

しかし、logcat を調べてみると、ソフト リファレンスが頻繁に収集されていることがわかりました。ログは次のとおりです。

私の知る限り、Java ヒープが限界まで大きくなり、新しいメモリ割り当て用のスペースがない場合にのみ、GC によってソフト参照が収集されます。

しかし、Android のソフト参照が期待どおりに動作しないのはなぜですか?

0 投票する
4 に答える
1108 参照

java - 弱参照と軟参照

弱い参照を使用すると、GC は次の GC サイクルで参照を収集できますが、ソフト参照は、メモリがいっぱいになるまで参照を保持し、メモリ エラーがスローされる前に、ソフト参照を削除します。これらの参照をどこで使用しますか? キャッシュを実装するのに最適なリファレンスはどれですか? 例:キャッシュにソフト参照を使用すると、メモリがいっぱいになるとクリアされます。しかし、データベースの詳細をいくつかフェッチしてメモリに入れ、その詳細をソフト参照にキャッシュしたとします。メモリからキー値を削除しても、キャッシュにはまだ存在します。これで弱参照を使用する必要がありますか?ケース?決定はどのように行われるべきですか?

0 投票する
0 に答える
66 参照

java - SoftReference の参照先でファイナライズをオーバーライドしてデータを維持することに問題はありますか?

そのため、データベースからオブジェクトを取得するコードを書いています。これらのオブジェクトのいくつかはかなり重いです。それらをキャッシュする方法が必要です。これを行うために、.a で永続オブジェクトを参照しますSoftReference

ただし、外部の力がデータベースに作用し、現在のスレッドが知らないうちにデータベースからこのオブジェクトを削除する可能性があります。私がやりたいことは、これが発生してSoftReference収集された場合にオブジェクトを失うリスクを減らすことです。

そのために、私はこのコードを書きました

要約すると、最初にデータベースからオブジェクトを取得すると、オブジェクトHolderは の参照先である に配置されSoftReferenceます。この時点で値hardRefが「アンカー」として使用され、必要に応じてデータベースからオブジェクトが引き出されます。nulllong

メモリが不足すると、SoftReferenceが収集される可能性があります。ただし、その前に、オブジェクトがまだデータベース側に存在するかどうかを確認する必要があります。そうでない場合は、ローカルに保持されているオブジェクトを に転送し、 をhardRefに設定SoftReferencenullます。

オブジェクトがまだデータベースにある場合は、参照オブジェクトを収集しても問題ありません。次にオブジェクトを呼び出す必要があるときは、longID を使用して取得します。(その後、誰かがそれを削除した場合は、例外をスローしても問題ありません)。

  1. これは機能しますか?言い換えれば、Holder.referent が null ではなく、データ競合なしで hardRef をその値に設定できると期待できますか?

  2. 重大なパフォーマンス ヒットが見られると期待できますか? ファイナライズには多少のオーバーヘッドがあることは承知していますが、物事をぎりぎりで停止させない限り、問題はないと思います。

finalize() は悪であり、決して使用すべきではないと誰もが言っているように見えるので、私はこの質問をしています。問題は、それ以外の方法が見当たらないことです。

0 投票する
1 に答える
259 参照

java - ReferenceQueue はオブジェクト プーリングに適していますか?

私は自分のライブラリでバッファ プーリングを使用したいと考えており、SoftReferences を使用してオブジェクトの暗黙的なリターンとプール サイズのバランスを実現することを考えました。

つまり、「適切」とは、次のことを意味します。

  1. たとえば、明示的な ArrayBlockingQueue と比較して非常にパフォーマンスが高いですか? (一桁未満)
  2. それらは最新の VM (Hotspot、Dalvik、ART など) でWeakReferences よりも「ソフト」に動作するのに十分な信頼性がありますか?

私にとって、それは「時期尚早の最適化」ではなく、オブジェクトをプールに返す手間を軽減できるアーキテクチャ上の選択にすぎませんが、指定された要件を満たさない場合、プールの利点を無効にします。