問題タブ [weak-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 - db4o の複雑なオブジェクト構造で WeakReference を使用できますか?
アプリケーションを db4o に移植することを検討しています。データ モデルは、相互に多くの参照を持つ多数の小さなオブジェクトで構成されています。たとえば、著者と章を示す本があります。章にはセクションがあり、セクションにはテキストや画像の大きな塊があり、言及された文字を参照しています。
メタ構造 (テキスト BLOB を除くすべて) をメモリに保持することは可能だと思いますが、WeakReference を含む巧妙なトリックを使用して、db4o が本当に必要なモデルの一部をメモリに保持できるかどうか疑問に思っていました (つまり、最近使用しています)。
同じことがテキスト BLOB にも当てはまります (約 1 ~ 10 KB である必要があります)。DB レイヤーを気にせずに、ゲッター内の人工 ID を使用してテキスト blob を照会したり、テキスト全体を常にメモリに保持するハード参照を使用したりせずに、文字列を取得することは可能ですか?
java - db4oを使用してデータモデルで大きな子をキャッシュする
スケルトン(メタデータ)と大きなデータオブジェクトを持つデータモデルがあります。スケルトンをメモリに保持し、データオブジェクトへの弱参照を保持したいと思います。プレーンJavaでこれを実装する方法、WeakHashMapを作成してクリーンアップする方法などを理解しています。しかし、GCされた後、データオブジェクトを復活させるための最良の方法は何でしょうか。
データオブジェクトのフィールドに割り当てたテクニカルキーをマップに追加して、もう一度見つけることができるようにする必要がありますか?または、db.ext()。getId()を呼び出して、このIDをテクニカルキーとして使用する必要がありますか?もしそうなら、親をロードするときにこれらのキーをどのように取得しますか?何を指示してるんですか?
python - Python での weakref キャッシュの構築
私は現在、汎用オブジェクトの一種のキャッシュが必要な Python でプロジェクトをコーディングしています。これには WeakValueDictionaries を使用することにしました。これらのジェネリック オブジェクトは、多くの場合、他の多くの非ジェネリック オブジェクトによって参照されます。ただし、私の主な問題は、これらの WeakValueDictionaries をプログラムのさまざまな部分で使用できるようにする方法に頭を悩ませているように見えないことです。可能であれば、「グローバル」変数を使用しないことをお勧めします。
よろしくお願いします
フレデリクNS
c# - 弱参照辞書の圧縮
プロパティIDを持つクラスFooがあります。私の目標は、同じIDを持つFooのインスタンスが同時に2つ存在しないことです。
そこで、同じIDに対して同じインスタンスを返すためにキャッシュを使用するファクトリメソッドCreateFooを作成しました。
キャッシュは、 @JaredParのWeakReferenceハッシュテーブルの構築に基づいてDictionary<TKey、WeakReference>として実装されます。
問題は、ターゲットがガベージコレクションされた後もWeakReferencesがディクショナリに残ることです。これは、 @ Pascal CuoqがWeakReference.TargetのGC後にWeakReferenceに何が起こるかで説明されているように、死んだWeakReferenceを手動で「ガベージコレクション」する方法の戦略が必要であることを意味します。
私の質問は、WeakReference辞書を圧縮するための最良の戦略は何ですか?
私が見るオプションは次のとおりです。
辞書からWeakReferencesを削除しないでください。IMOこれは悪いことです。なぜなら、キャッシュはアプリケーションの存続期間全体で使用され、多くの死んだWeakReferenceが時間の経過とともに蓄積されるからです。
各PutおよびTryGetValueで辞書全体をウォークし、死んだWeakReferencesを削除します。両方の操作がO(n)になるため、これは辞書の目的をいくらか無効にします。
辞書全体をバックグラウンドスレッドで定期的にウォークします。CreateFooの使用パターンがわからない場合、適切な間隔はどれくらいですか?
挿入された各KeyValuePairを両端のリンクリストに追加します。PutおよびTryGetValueを呼び出すたびに、リストの先頭が調べられます。WeakReferenceが有効な場合は、ペアをリストの最後に移動します。死んでいる場合は、リストからペアを削除し、ディクショナリから弱参照を削除します。
カスタムハッシュテーブルを実装しますが、バケットがいっぱいになると、通常どおり続行する前に、デッドWeakReferencesが最初にバケットから削除されます。
他の戦略はありますか?
最善の戦略は、おそらく時間計算量を償却したアルゴリズムです。そのような戦略は存在しますか?
java - Java のイベント リスナーに適したコレクション クラス
関連: Javaには「LinkedConcurrentHashMap」データ構造がありますか?
イベント リスナーへの参照を保持するコレクション クラスを探しています。
理想的には、コレクションに次のプロパティを持たせたいと思います (優先度順):
- 挿入順序を維持します。以前のリスナーはイベントをキャンセルし、後で追加されたリスナーに配信されないようにする場合があります。
HashSet
イテレータが間違った順序で要素を返すようなクラスを使用すると、これは壊れます。 - s を使用
WeakReference
して、リスナー リストがリスナーのガベージ コレクションを妨げないようにします。 - コレクションは である
Set
ため、重複は自動的に削除されます。 - これ
Iterator
はコレクションのスレッドセーフなスナップショットであり、新しいリスナーの追加による影響を受けません。イベントを複数のスレッドに配信することもできます。(これは必須ではありません。代わりに、セットのクローンを反復処理できます。)
これらの基準のすべてではなく一部を満たすいくつかのクラスを認識しています。例:
java.util.LinkedHashSet
(#1 と #3)java.util.WeakHashMap
、Collections.newSetFromMap
(#2 と #3)でラップjavax.swing.event.EventListenerList
(追加の同期が必要です) (#1 と #4)java.util.concurrent.CopyOnWriteArraySet
(#1、#3、#4)
しかし、#1と#2の両方には何もありません。このようなクラスはどこかのライブラリに存在しますか?
wpf - Josh SmithによるRelayCommandの実装に欠陥がありますか?
Josh Smithの記事「Model-View-ViewModelデザインパターンを使用したWPFアプリ」、具体的にはRelayCommand
(図3)の実装例を検討してください。(この質問については、記事全体を読む必要はありません。)
一般的に、実装は優れていると思いますが、のイベントCanExecuteChanged
へのサブスクリプションの委任について質問があります。州のドキュメント:CommandManager
RequerySuggested
RequerySuggested
このイベントは静的であるため、弱参照としてのみハンドラーを保持します。このイベントをリッスンするオブジェクトは、ガベージコレクションを回避するために、イベントハンドラーへの強力な参照を保持する必要があります。これは、プライベートフィールドを用意し、このイベントにアタッチする前または後にハンドラーを値として割り当てることで実現できます。
しかし、のサンプル実装はRelayCommand
、サブスクライブされたハンドラーに対してそのようなものを維持していません。
- これにより、弱参照が
RelayCommand
クライアントにリークされ、ユーザーがライブ参照RelayCommand
の実装を理解してCanExecuteChanged
維持する必要がありますか? もしそうなら、例えば、加入者
/li>RelayCommand
の潜在的な時期尚早のGCを軽減するために、の実装を次のようなものに変更することは理にかなっていますか?CanExecuteChanged
python - 循環参照のため、弱参照コールバックが呼び出されない
循環参照を持つ Python クラスのファイナライザーを作成しようとしています。弱い参照のコールバックが最適な方法であることがわかりました。残念ながら、コールバックとして使用するラムダは決して呼び出されないようです。たとえば、次のコードを実行します。
戻り値:
循環参照を削除すると、ラムダ コールバックが機能します (「An A deleted: a1」が出力されます)。単純な関数呼び出しでラムダを置き換えることも機能しますが、コールバックを呼び出すときではなく、弱参照を初期化するときにパラメーター値が固定されます。
戻り値:
ラムダコールバックが循環参照で機能しない理由は何ですか?
c++ - アトミックに比較とインクリメントを行う方法は?
スレッド セーフな C++ ウィーク ポインター テンプレート クラスを開発する試みでは、オブジェクトがまだ生きていることを示すフラグをチェックする必要があります。存在する場合は、オブジェクトの参照カウントをインクリメントし、両方の手順をアトミックに実行する必要があります。
_InterlockedCompareExchange() や _InterlockedIncrement() など、コンパイラによって提供される組み込み関数の存在を知っています。しかし、私が欲しいのは interlockedCompareIncrement() 関数です。少なくとも Windows x86 プラットフォームで、他のプリミティブを使用してこの組み込みをシミュレートする効率的な方法はありますか?
python - Python で弱参照を使用するのはいつですか?
弱参照の使い方を説明できる人はいますか?
ドキュメントはそれを正確に説明していません.GCはいつでも弱参照を介してリンクされたオブジェクトを破棄できると言っているだけです. では、いつでも消える可能性のあるオブジェクトを持っていることに何の意味があるのでしょうか? 消えた直後に使いたい場合は?
良い例を挙げて説明していただけますか?
ありがとう
java - JDKクラス内のjava.lang.ref.WeakReferenceオブジェクトのメモリリーク
java.lang.ref.WeakReference
次の簡単なコードは、ヒープ内のオブジェクトの成長を再現します。
数秒間隔でのjmapコマンドの出力は次のとおりです。
jmapコマンドはFullGCを強制することに注意してください。