問題タブ [reference-counting]
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.
c# - C#で参照カウント+ガベージコレクションがないのはなぜですか?
私はC++のバックグラウンドを持っており、C#を使用して約1年になります。他の多くの人と同じように、決定論的なリソース管理が言語に組み込まれていない理由について私は困惑しています。決定論的デストラクタの代わりに、disposeパターンがあります。人々は、IDisposable癌を自分たちのコードを通して広めることが、努力する価値があるかどうか疑問に思い始めます。
私のC++バイアスの頭脳では、決定論的デストラクタで参照カウントスマートポインタを使用することは、IDisposableを実装し、disposeを呼び出して非メモリリソースをクリーンアップする必要があるガベージコレクタからの大きな一歩のようです。確かに、私はあまり頭が良くないので、純粋に、物事が現状のままである理由をよりよく理解したいという願望からこれを求めています。
C#が次のように変更された場合はどうなりますか?
オブジェクトは参照カウントされます。オブジェクトの参照カウントがゼロになると、リソースのクリーンアップメソッドがオブジェクトに対して決定論的に呼び出され、オブジェクトにガベージコレクションのマークが付けられます。ガベージコレクションは、将来の非決定的な時点で発生し、その時点でメモリが再利用されます。このシナリオでは、IDisposableを実装したり、Disposeを呼び出すことを忘れないでください。解放する非メモリリソースがある場合は、リソースクリーンアップ機能を実装するだけです。
- なぜそれは悪い考えですか?
- それはガベージコレクターの目的を損なうでしょうか?
- そのようなことを実行することは可能でしょうか?
編集:これまでのコメントから、これは悪い考えです。
- GCは参照カウントなしで高速です
- オブジェクトグラフのサイクルを扱う問題
1番目は有効だと思いますが、2番目は弱参照を使用して簡単に処理できます。
したがって、速度の最適化は、次のような短所を上回ります。
- 非メモリリソースをタイムリーに解放できない場合があります
- 非メモリリソースをすぐに解放する可能性があります
リソースのクリーンアップメカニズムが決定論的で言語に組み込まれている場合は、これらの可能性を排除できます。
c++ - Microsoft オブジェクト、Release() 関数は値を返しますか?
MSDNでこれについて知ることができなかったので、私は興味があります。Release()
この関数は、ポインターを削除するために使用するはずのさまざまな COM オブジェクトに存在することがわかりました。しかし、それが正確に何を返すのかわかりませんか?私は、残りのオブジェクトにまだ存在する参照の数を返すと思っていたので、次のようになります。
そのポインターへのすべての参照を明らかに解放しますか?
それとも私は何かを見ていませんか?
IDirect3DTexture9::Release()
*関数の概念からこれについて話していることに注意してください
php - PHPでメモリリークを修正する方法
私のPHPアプリには、レコードをインポートできるインポートスクリプトがあります。
現在、CSVファイルからインポートしています。CSVファイルの各行をfgetcsvを使用して一度に1行ずつ読み取り、各行について、データベースクエリを含むそのレコードに対して多くの処理を実行してから、次の行に移動します。より多くのメモリを蓄積し続ける必要はありません。
約2500レコードがインポートされた後、PHPはメモリ制限(132 MB程度)を超えたと言って停止します。
CSVファイル自体はほんの数メガです-発生する他の処理は多くの文字列比較、差分などを行います。私はそれを操作する大量のコードを持っており、最小の複製を思い付くのは難しいでしょうサンプル'。
そのような問題を見つけて修正するための良い方法は何ですか?
問題の原因が見つかりました
実行時にすべてのデータベースクエリをログに記録するデバッグクラスがあります。そのため、約30KBの長さのSQLの文字列がメモリに残っていました。これは、長時間実行するように設計されたスクリプトには適していないことに気付きました。
他にもメモリリークの原因がある可能性がありますが、これが私の問題の原因であると確信しています。
c++ - オブジェクトがC++の新しいスレッドに渡されるタイミングを検出しますか?
オブジェクトを参照しているスレッドの数を追跡したいオブジェクトがあります。一般に、オブジェクトのメソッドが呼び出されると、スレッドローカルブール値をチェックして、現在のスレッドのカウントが更新されているかどうかを判断できます。しかし、ユーザーが、boost::bindを使用してオブジェクトをboost::functionにバインドし、それを使用してboost :: threadを開始すると言った場合、これは役に立ちません。新しいスレッドは私のオブジェクトへの参照を持ち、そのメソッドのいずれかを呼び出す前に無期限にそのオブジェクトを保持する可能性があるため、カウントが古くなります。これを処理するためにboost::threadの周りに独自のラッパーを作成することもできますが、ユーザーのboost::bindが次のオブジェクトを含む場合は役に立ちません。私のオブジェクト(メンバータイプの存在に基づいて専門化することはできません-少なくともそれを行う方法はわかりません)そしてそれを使用してboost::threadを開始します。
これを行う方法はありますか?私が考えることができる唯一の手段は、ユーザーからの多大な作業を必要とします-渡されるオブジェクトに対して特別なフックメソッドを呼び出すboost :: threadのラッパーを提供し、オブジェクトが存在する場合、ユーザーは特別なフックメソッドを任意のクラスに追加しますそれは私のオブジェクトを含んでいます。
編集:この質問のために、私は新しいスレッドを作成する手段を制御していると仮定できます。たとえば、boost :: threadをラップして、ユーザーがラップしたバージョンを使用することを期待できます。ユーザーがpthreadなどを同時に使用することを心配する必要はありません。
Edit2:__thread
またはを介してスレッドローカルストレージを利用できる手段があると想定することもできますboost::thread_specific_ptr
。現在の標準には含まれていませんが、間もなくリリースされることを願っています。
reference-counting - 循環参照にはどのような解決策がありますか?
参照カウントを使用する場合、循環参照を処理するための可能な解決策/手法は何ですか?
最もよく知られている解決策は弱参照を使用することですが、この主題に関する多くの記事は、他の方法もあることを示唆していますが、弱参照の例を繰り返し続けます。これらの他の方法は何ですか?
私は、参照カウントの代替手段は何かを尋ねているのではなく、参照カウントを使用する場合の循環参照の解決策は何かを尋ねています。
この質問は、特定の問題/実装/言語に関するものではなく、一般的な質問です。
c# - C#のオブジェクトグラフ内でオブジェクトが到達可能かどうかを判断するにはどうすればよいですか?
にオブジェクトがある非常に複雑なオブジェクトグラフがG
あります。NHibernateを使用してデータベースに書き込まれます。ただし、データベースに(それを呼びましょう)の永続的なエントリがすでに存在する場合は、の代わりに使用します。したがって、データベースに冗長なエントリがあってはなりません。今、私はNHibernateにその仕事を任せ、その後データベースを調べます。今、私は避けようとした状況を正確に持っています。データベースには、元のオブジェクトに加えてのエントリがあります。私がこれまでに持っている唯一の説明は、別のルートを介して到達可能であるということですo1
G
G
o1
o1_p
o1
o1_p
o1_p
o1
o1
G
そのため、hibernateはそれをデータベースに入れます。これが当てはまるかどうかを判断する方法はありますか。つまり、ガベージコレクターに参照がいくつあるかを尋ねることができますかo1
。またはグラフ言語で話す:入力エッジはo1
いくつありますか?
.net - .NET での WeakReference の実装
.NET フレームワークでのSystem.WeakReferenceクラスの有用性は理解していますが、実装の詳細については興味があります。
WeakReference は .NET でどのように実装されていますか? MSDN では WeakReference の使用法について詳しく説明していますが、これが内部でどのように機能するかについて私が見た詳細はほとんどありません。
CLR はどのように参照を追跡し、ターゲットが収集されたときに GC を妨げずに内部ハンドルを null にすることを知っていますか? CLR自体で特別な処理が必要ですか?
私の主な関心事は、標準のオブジェクト参照を使用する場合とは異なる、WeakReferences を使用すること (特にそれらの多くを使用する場合) のパフォーマンスへの影響があるかどうかです。
c++ - C++ std::list<> に大きなデータを保存する..参照カウントを使用する必要がありますか?
人々は通常、大きなオブジェクトのリストをコピーすることをどのように管理していますか?
これが私の状況です:
現在、私はこれを持っています:
そして、私はそれを
Image.size() は非常に大きいです (それぞれが 3 ~ 5 MB です)。
リストを渡します (コピーします)。
std::vector が各要素を値でコピーするという私の理解は正しいですか? もしそうなら、コピーが多すぎてパフォーマンスが少しひどいのではないでしょうか?
コピーを最小限に抑えるにはどうすればよいですか? 代わりに保存する必要がありますか
どこ
?
この種の問題を処理するエレガントな方法は何ですか?
c++ - C ++:マルチスレッドと参照カウント
現在、iveは以下を使用していくつかの参照カウントクラスを取得しています。
また、参照カウントを処理するスマートポインタークラスもありますが、すべてが均一に使用されているわけではありません(たとえば、IncRefおよびDecRef呼び出しの数を最小限に抑えたパフォーマンスクリティカルなコードの1ビットまたは2ビットで)。
クラス自体の一般的な使用については、リーダー/ライターロックシステムを使用する予定ですが、IncRefおよびDecRefの呼び出しごとにライターロックを取得する必要はありません。
また、IncRef呼び出しの直前にポインターが無効になる可能性があるシナリオについても考えました。次のことを考慮してください。
したがって、参照カウントモデルを完全に変更する必要があると思います。デザインに戻った後に参照を追加した理由は、次のようなものをサポートするためでした。
する必要はなく:
マルチスレッド環境でC++で高速参照カウントを行うためのクリーンな方法はありますか?
multithreading - LWARXおよびSTWCXと同等のx86
LWARXおよびSTWCX(PowerPCプロセッサにある)と同等のもの、またはx86プラットフォームに同様の機能を実装する方法を探しています。また、そのようなことを知るのに最適な場所はどこですか(つまり、ロック/待機なしのプログラミングのための優れた記事/ Webサイト/フォーラム)。
編集
CAS(コンペアアンドスワップ)操作を探しているだけであると想定されているため、詳細を説明する必要があると思います。私がやろうとしているのは、複数のスレッドからアクセスして変更できるスマートポインターを使用して、ロックフリーの参照カウントシステムを実装することです。基本的に、x86プロセッサに次の関数を実装する方法が必要です。
これを実現するには、LWARXとSTWCXをかなり正確に模倣するものが本当に必要です(これまでにx86で見つけたCompareExchange、スワップ、または追加関数を使用してこれを行う方法がわかりません)。
ありがとう