問題タブ [garbage-collection]
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.
programming-languages - テール コールの最適化にガベージ コレクションが必要なのはなぜですか?
末尾呼び出しの最適化にガベージ コレクションが必要なのはなぜですか? テールコールを実行したい関数にメモリを割り当てた場合、テールコールを実行してそのメモリを取り戻す方法がないからですか? (したがって、末尾呼び出しの後にメモリを再利用できるように、スタックを保存する必要があります。)
asp.net - asp.net で (手動でサブスクライブした) イベントのサブスクライブを解除する必要がありますか?
イベントへのサブスクライブ/サブスクライブ解除に関する同じベスト プラクティス ルールが asp.net に適用されますか?
ばかげた質問のように思えるかもしれませんが、考えてみると、人々が最初にページのイベントにサブスクライブし、後で Web リクエストでサブスクライブを解除するコードを見たことがありません。
例 1: ページの Page_Load メソッドで、ListView の更新イベントをサブスクライブします。OnPreRenderComplete メソッドなどで、後でそのイベントのサブスクライブを解除する必要がありますか?
例 2: パッシブ ビュー パターンでは、ビュー (ページ コントロール/ユーザー コントロール) は、プレゼンターが何かをする必要があるときはいつでもイベントを発生させます。プレゼンターはビューのイベントをサブスクライブする必要がありますが、イベントのサブスクライブを再度解除する必要もありますか?
よろしく、エギル。
java - 内部マップで自身のインスタンスを追跡するガベージコレクションオブジェクト
クラスのコンストラクターでは、現在のオブジェクト(this)とそのキー(コンストラクターにパラメーターとして入力された文字列)を静的なLinkedHashMapにマップし、後で必要になる可能性のある場所で文字列によってオブジェクトを参照できるようにします。 。
コードは次のとおりです(役立つ場合):
問題?このクラスのインスタンスは、使い終わってもガベージコレクションされません。
このクラスのインスタンスを使い終わったときに、毎回手動でRemove()メソッドなどを呼び出さなくても、このクラスのインスタンスをクリーンアップする方法があるかどうか知りたいです(内部のLinkedHashMapでその参照を削除するために)私はもうそれらを使用していません、つまり)。
c# - .NET に弱い参照はありますか?
アプリケーションで特定のクラスのオブジェクトのリストを保持したいと考えています。しかし、私はまだオブジェクトをガベージコレクションしたいと思っています。.NET で弱参照を作成できますか?
参考のため:
MSDN からの回答:
オブジェクトとの弱い参照を確立するには、追跡するオブジェクトのインスタンスを使用して WeakReference を作成します。次に、Target プロパティをそのオブジェクトに設定し、オブジェクトを null に設定します。コード例については、クラス ライブラリの WeakReference を参照してください。
objective-c - 10.5+ 用に作成する場合、Objective-C ガベージ コレクションを使用する必要がありますか?
OS X 10.5 以降の環境でかなり一般的な Mac コードを作成する場合、ガベージ コレクションを使用することの欠点は何ですか?
これまでのところ、私が書いたものはすべて 10.4 と互換性があるか、iPhone 上にあるので、retain/release にかなり慣れてきましたが、今は 10.5 のみのより大きなプロジェクトに取り組んでいるので、先に進み、Objective-C 2.0 ガベージ コレクターを使用することの欠点です。
皆さんはどう思いますか?
c# - オブジェクトにファイナライザーがあると CLR が判断するのはいつですか?
~MyClass()
C# で と書くと、これは基本的に に変換されることを私は知っていますoverride System.Object.Finalize()
。したがって、デストラクタを記述するかどうかに関係なく、CLR のすべての型には(少なくとも)Finalize()
メソッドが含まれます。System.Object
1] では、すべてのオブジェクトがデフォルトでファイナライザーを持っているということですか?
2] CLR がオブジェクトをファイナライズ キューに入れる必要があると判断する根拠は何ですか?
私はクラスを持っていたので、私はこれを求めていManagedResourceHolder
ます。このクラスは管理されていないリソースをまったく保持せず、メソッドも 必要ありませんでした。つまり、 finalizerがなかったため、呼び出しが必要ありませんでした。IDisposable
GC.SuppressFinalize(this)
IDisposable.Dispose()
~ManagedResourceHolder()
GC.SuppressFinalize(this)
3] 上記のシナリオのコンテキストでは、IDisposable を実装するときに常にファイナライザーを提供する必要がありますか? (アンマネージ リソースを保持しないクラスでも)
FxCop ルールCA1816により、これに関する違反が発生し、MSDN の CA フォーラムで質問したときに得た回答に混乱しました。
ありがとう。
objective-c - ガベージ コレクションを使用すると、新しく作成された Cocoa アプリでメモリ リークが発生しますか?
私は、最新の Cocoa プロジェクトのメモリ管理に GC を使用することにしました。そして、興味深いことを発見しました。Xcode でまったく新しい Cocoa アプリ プロジェクトを作成する場合、GC をサポート対象または必須に変更し (両方を試しました)、ビルドして実行します。リークすると、メモリ リークが表示されます。
ほとんどの場合、NSCFData、GeneralBlock、CGEvent、CFDictionary、CGSRegion などのタイプのオブジェクトの多数の小さなリーク。
再現する手順:
- ファイル -> 新しいプロジェクト -> Cocoa アプリ
- プロジェクト -> プロジェクト設定の編集 -> GC 必須 (またはサポートされている、いずれか)
- ビルド -> ビルド
- 実行 -> パフォーマンス ツールで実行 -> リーク
- リーク検出がトリガーされるのを待ちます (私は 10 秒に設定しています。デフォルトは 30 秒です)。
約 80% の確率で、上記の種類のさまざまなオブジェクトの約 2 ~ 20 KB のリークが発生します。
他の誰かがこれと同じ行動をしていますか?
編集: InputManagers フォルダーの名前を変更して以下の状況をテストしました (その時点でログ メッセージは消えたため、ログ メッセージは確実に読み込まれなくなりました)、まだメモリ リークが発生しています。したがって、それと関係がある可能性は低いと思われます。私はそこにテキストを残しているので、アシュリー・クラークの答えはまだ理にかなっています.
私が知っている唯一の奇妙な状況は、GC を有効にしてアプリを実行するたびに、コンソールに次のメッセージが表示されることです。
これは、Safari (プラグイン用) だけでなく、起動するすべてのプログラムにロードしようとする 2 つのプラグインと関係があると思います。それがこれと関係があるかどうかはわかりませんが、間違いなく可能性があるようです。OS X 10.5 の代わりに開発ツールを使用して、SAFT や Inquisitor を使用せずに未使用のインストールで同じことが起こるかどうかをテストするためのクリーンな環境に簡単にアクセスできません。
c# - イベント処理に匿名デリゲートを使用する場合のガベージ コレクション
アップデート
ここからのさまざまな回答を組み合わせて、新しい質問に対する「決定的な」回答を作成しました。
元の質問
私のコードには、アプリケーションの存続期間全体にわたって存在するイベント パブリッシャーがあります (ここでは必要最小限に縮小されています)。
このパブリッシャーはあらゆる場所で使用できるため、すべてのサブスクライバーで処理コードを書き直さなくても済むように、この小さなヘルパー クラスを作成できたことに非常に満足しています。
小さなマシンで使い始めるまでは問題なく動作していましたが、時折発生するようになりました。
結局のところ、サブスクライバー コントロールが動的に作成、追加、およびフォームから削除されるコード内の場所が 1 つあります。ガベージ コレクションなどについての高度な理解 (つまり、昨日まで何もなかった) を考えると、ほとんどの場合、サブスクライバーもアプリケーションの存続期間中存続するため、後片付けをするとは思いもしませんでした。
私はしばらくの間、Dustin Campbell の WeakEventHandlerをいじりましたが、匿名のデリゲートでは機能しません(とにかく私にとってはそうではありません)。
とにかくこの問題はありますか?ショップ全体で定型コードをコピーして貼り付ける必要はありません。
(ああ、わざわざコントロールを作成したり破棄したりする理由を私に尋ねることは気にしないでください。それは私の設計上の決定ではありません...)
(PS: これは winforms アプリケーションですが、VS2008 と .Net 3.5 にアップグレードしました。Weak Event パターンの使用を検討する必要がありますか?)
(PPS:Rory からの良い答えですが、誰かが WeakEventHandler に相当するものを思いつくことができれば、明示的に UnLink/Dispose することを覚えておく必要がなくなります。それはクールです...)
編集問題のコントロールを「リサイクル」することで、この問題を回避したことを認めなければなりません。ただし、使用していた「キー」が明らかに一意ではないため、回避策が戻ってきて私を悩ませています(すすり泣く)。ここで他のリンクを発見しました(これを試してみました-少し弱すぎるようです-ターゲットがまだ生きていてもGCはデリゲートをクリアします。以下のs、oɔɯǝɹの回答と同じ問題です)、ここ(パブリッシャーを変更する必要があり、そうではありません匿名のデリゲートでは実際には機能しません) およびhere (Dustin Campbell による不完全として引用)。
私が探しているものは意味的に不可能かもしれないと思います.クロージャーは「私がいなくなった後でもぶらぶらする」ように設計されています.
私は別の回避策を見つけたので、神々からの声を待って、それを使い続けます.
c# - しばらくすると、GC に多数のピン留めされたオブジェクトが含まれる
com-wrapper を継続的にインスタンス化し、GC に (強制ではなく) 収集させると、奇妙な現象が発生します。
WinCE x86 の .net cf でこれをテストしています。.net Compact フレームワークのリモート モニターでパフォーマンスを監視します。ネイティブ メモリは、プラットフォーム ビルダー ツールキットの Windows CE リモート パフォーマンス モニターで追跡されます。
最初の 1000 個の作成されたインスタンスの間、perfmon のすべてのカウンターは正常に見えます。
- GC ヒープは増減しますが、平均は変わりません
- ピン留めされたオブジェクトは 0 です
- ネイティブメモリは同じ平均を維持します
- ...
ただし、これらの 1000 (およそ) の後、ピン留めされたオブジェクト カウンターは上昇し、カウントが減少することはありません。ただし、メモリ使用量は同じままです。
この情報からどのような結論を引き出すべきかわかりません... これはカウンターのバグですか、これは私のソフトウェアのバグですか?
[編集]
コンパクターによって移動されていないオブジェクトと同様に、GC が安定した後に使用中の合計バイト数がすぐに増加し始めることに気付きました。
カウンターのグラフィック http://files.stormenet.be/gc_pinnedobj.jpg
[/編集]
関連するコードは次のとおりです。
Image オブジェクトには AlphaImage が含まれています。
asp.net - 「% Time in Garbage Collection」問題の診断
プロダクション グレードのサーバー (デュアル クアッド コア、4g) で負荷テストを行うと、ガベージ コレクションに 40% 以上の時間を費やす ASP.NET 2.0 アプリケーションがあります。私は問題を切り分けようとしていますが、コードベースが大きく複雑であるため、処理が遅くなります。GC.Collect() 呼び出しはありません。この種の問題を特定する際に役立つツールや手法はどれですか?