問題タブ [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.
.net - GC.Collect() を使用することの何が問題なのですか?
この関数をいじることの深刻な意味は理解できますが (または、少なくとも私はそう考えています)、立派なプログラマーが、知らない人でさえも使用しないようなものの 1 つになっている理由がわかりません。それは何のためです。
ユーザーが何をしているかによってメモリ使用量が大きく変化するアプリケーションを開発しているとしましょう。アプリケーションのライフ サイクルは、編集とリアルタイム処理という 2 つの主要な段階に分けることができます。編集段階で、数十億、場合によっては数兆のオブジェクトが作成されるとします。小さいものもあればそうでないものもあり、ファイナライザーを持っているものも持っていないものもあり、それらの寿命は非常に数ミリ秒から長い時間までさまざまであるとします。次に、ユーザーはリアルタイム ステージに切り替えることを決定します。この時点で、パフォーマンスが基本的な役割を果たしており、プログラムの流れのわずかな変更が壊滅的な結果をもたらす可能性があるとします。その後、オブジェクトプールなどを使用してオブジェクトの作成を最小限に抑えますが、GC が予期せず鳴り響いてすべてを破棄し、誰かが死亡します。
質問: この場合、第 2 段階に入る前に GC.Collect() を呼び出すのが賢明ではないでしょうか?
結局のところ、これら 2 つの段階が互いに時間的に重なることはなく、GC が収集できたすべての最適化と統計は、ここではほとんど役に立たないでしょう...
注: ご指摘のとおり、.NET はこのようなアプリケーションに最適なプラットフォームではないかもしれませんが、それはこの質問の範囲を超えています。その意図は、GC.Collect() 呼び出しがアプリケーションの全体的な動作/パフォーマンスを改善できるかどうかを明確にすることです。そのようなことを行う状況が非常にまれであることは誰もが同意しますが、GC は推測を試み、ほとんどの場合は完全にうまくいきますが、それでも推測にすぎません。
ありがとう。
c# - オブジェクトがまだ使用されている間にファイナライザーが起動されました
概要: C#/.NET はガベージ コレクションの対象になるはずです。C# には、リソースをクリーンアップするために使用されるデストラクタがあります。オブジェクト A が、その変数メンバーの 1 つを複製しようとしたのと同じ行でガベージ コレクションされるとどうなりますか? どうやら、マルチプロセッサでは、ガベージコレクタが勝つことがあります...
問題
今日、C# のトレーニング セッションで、先生は、マルチプロセッサで実行した場合にのみバグを含むコードをいくつか見せてくれました。
要約すると、呼び出されたメソッドから戻る前に C# クラス オブジェクトのファイナライザーを呼び出して、コンパイラーまたは JIT が失敗することがあります。
Visual C++ 2005 ドキュメントに記載されている完全なコードは、非常に大きな質問を避けるために「回答」として投稿されますが、重要なものは以下のとおりです。
次のクラスには、内部配列の複製コピーを返す「ハッシュ」プロパティがあります。この構築では、配列の最初の項目の値は 2 です。デストラクタでは、その値はゼロに設定されます。
ポイントは次のとおりです。「例」の「ハッシュ」プロパティを取得しようとすると、オブジェクトが使用されているため (そのため、使用されていないため、最初の項目がまだ 2 である配列のクリーンなコピーが取得されます)。ガベージ コレクション/ファイナライズ済み):
しかし、これほど単純なことはありません... このクラスを使用するコードはスレッド内で実行されます。もちろん、テストのために、アプリは高度にマルチスレッド化されています。
DoWork 静的メソッドは、問題が発生するコードです。
DoWork の 1,000,000 回の実行ごとに、明らかに、ガベージ コレクターはその魔法を実行し、関数の remaning コードで参照されなくなったため、"ex" を再利用しようとします。今回は、"Hash" よりも高速です。メソッドを取得します。したがって、最終的に得られるのは、正しいバイト配列 (最初の項目が 2 の場合) ではなく、ゼロで埋められたバイト配列のクローンです。
私の推測では、コードのインライン化があり、DoWork 関数で [1] とマークされた行が次のように置き換えられます。
Hash2 が次のようにコード化された単純なアクセサであると仮定した場合:
問題は、これは C#/.NET でそのように動作するはずなのか、それとも JIT のコンパイラのバグと見なすことができるのかということです。
編集
説明については、Chris Brumme と Chris Lyons のブログを参照してください。
http://blogs.msdn.com/cbrumme/archive/2003/04/19/51365.aspx
http://blogs.msdn.com/clyon/archive/2004/09/21/232445.aspx
皆さんの回答は面白かったのですが、どれも良いとは言えませんでした。だから私はあなたに+1を与えました...
ごめん
:-)
編集 2
同じ条件 (複数の同じ実行可能ファイルを同時に実行する、リリース モードなど) で同じコードを使用したにもかかわらず、Linux/Ubuntu/Mono で問題を再現できませんでした。
java - ラムダプローブは死んだ?
LambdaProbeのソースコードを入手できる場所を知っている人はいますか?
または、プロジェクトをコミュニティ リポジトリに移動できるかどうかを知っている人はいますか?
ツールが 1 年以上更新されていないことに加えて、LambdaProbe Web サイトは 2008 年 9 月下旬からダウンしています。
背景: Lambda Probe は、実行中の Tomcat サーバーの統計を表示するための便利なツールです。以前はhttp://www.lambdaprobe.orgで見つかりました。
c++ - C++ にガベージ コレクタがないのはなぜですか?
まず第一に、ガベージ コレクションのメリットがあるため、この質問をしているわけではありません。私がこれを質問する主な理由は、Bjarne Stroustrup が C++ にはいつかガベージ コレクタが搭載されるだろうと言ったことを知っているからです。
そうは言っても、なぜ追加されていないのですか?C++ 用のガベージ コレクタは既にいくつかあります。これは、「言うは易く行うは難し」タイプのものの 1 つにすぎませんか? それとも、追加されていない (C++ 11 では追加されない) 他の理由がありますか?
相互リンク:
明確にするために、C++ が最初に作成されたときにガベージ コレクターがなかった理由を理解しています。なぜコレクターを追加できないのか不思議です。
c# - 1人の顧客のボックスにのみ表示されるメモリリーク(C#)を追跡するための最良の方法
1人の顧客のテスト/リリースボックスでのみ検出され、他の場所では検出されないメモリリークを追跡するための最良の方法は何ですか?
c# - GC.SuppressFinalize()はいつ使用する必要がありますか?
.NETでは、どのような状況で使用する必要がありますGC.SuppressFinalize()
か?
この方法を使用するとどのような利点がありますか?
php - PHP __destruct() メソッドが呼び出されることを信頼できますか?
PHP5 では、オブジェクト インスタンスごとに __destruct() メソッドが呼び出されることが保証されていますか? プログラムの例外により、これを防ぐことができますか?
c# - C# の固定ステートメント
プロジェクトの 1 つに、次のようなコードがあります。ここで固定ステートメントが必要な理由を誰でも (簡単な英語で) 説明できますか?
java - 解放されていないオブジェクトを保持しているものをどのように把握できますか?
私たちのプログラムの 1つで、OutOfMemory
あるユーザーのマシンでエラーが発生することがありますが、もちろん私がテストしているときはそうではありません。JProfiler を使用して実行し (これまで使用したことがないため、10 日間の評価ライセンスで)、コード プレフィックスでフィルタリングすると、合計サイズとインスタンス数の両方で最大のチャンクは、特定の単純なクラスの 8000 以上のインスタンスです。 .
JProfiler の [ガベージ コレクション] ボタンをクリックすると、他のクラスのほとんどのインスタンスが消えましたが、これらの特定のインスタンスは消えませんでした。同じインスタンスで再度テストを実行すると、クラスの 4000 以上のインスタンスが作成されましたが、[ガベージ コレクション] をクリックすると、それらは元の 8000 以上のインスタンスを残して消えてしまいました。
これらのインスタンスは、さまざまな段階でさまざまなコレクションにスタックします。それらがガベージコレクションされていないという事実は、何かがコレクションの1つへの参照を保持しているため、オブジェクトへの参照を保持していることを意味するに違いないと思います。
何が参照を保持しているのかを理解する方法はありますか? コードで何を探すべきかの提案と、ある場合は JProfiler でこれを見つける方法を探しています。