問題タブ [memory-management]
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#で手動でクリーンアップする必要があるリソースは何ですか?そうしないとどうなりますか?
たとえば、次のコードがあるとします。
Dispose メソッドを使用してブラシをクリーンアップしない場合、ガベージ コレクターがプログラムの終了時に使用されたメモリを解放すると仮定していますか? これは正しいです?
手動でクリーンアップするには、他にどのようなリソースが必要ですか?
linux - プロセスの「実際の」メモリ使用量、つまりプライベート ダーティ RSS を判断する方法はありますか?
「ps」や「top」などのツールは、VM サイズや常駐セット サイズなど、さまざまな種類のメモリ使用量を報告します。ただし、これらはどれも「実際の」メモリ使用量ではありません。
- プログラム コードは、同じプログラムの複数のインスタンス間で共有されます。
- 共有ライブラリ プログラム コードは、そのライブラリを使用するすべてのプロセス間で共有されます。
- 一部のアプリは、プロセスをフォークして、プロセスとメモリを共有します (たとえば、共有メモリ セグメントを介して)。
- 仮想メモリ システムにより、VM サイズ レポートはほとんど役に立たなくなります。
- プロセスがスワップ アウトされると RSS は 0 になるため、あまり役に立ちません。
- などなど
Linux によって報告されたプライベート ダーティ RSS が、「実際の」メモリ使用量に最も近いことがわかりました。Private_Dirty
これは、 のすべての値を合計することで取得できます/proc/somepid/smaps
。
しかし、他のオペレーティング システムは同様の機能を提供しますか? そうでない場合、代替手段は何ですか?特に、FreeBSD と OS X に興味があります。
.net - GC.Collect() を使用することの何が問題なのですか?
この関数をいじることの深刻な意味は理解できますが (または、少なくとも私はそう考えています)、立派なプログラマーが、知らない人でさえも使用しないようなものの 1 つになっている理由がわかりません。それは何のためです。
ユーザーが何をしているかによってメモリ使用量が大きく変化するアプリケーションを開発しているとしましょう。アプリケーションのライフ サイクルは、編集とリアルタイム処理という 2 つの主要な段階に分けることができます。編集段階で、数十億、場合によっては数兆のオブジェクトが作成されるとします。小さいものもあればそうでないものもあり、ファイナライザーを持っているものも持っていないものもあり、それらの寿命は非常に数ミリ秒から長い時間までさまざまであるとします。次に、ユーザーはリアルタイム ステージに切り替えることを決定します。この時点で、パフォーマンスが基本的な役割を果たしており、プログラムの流れのわずかな変更が壊滅的な結果をもたらす可能性があるとします。その後、オブジェクトプールなどを使用してオブジェクトの作成を最小限に抑えますが、GC が予期せず鳴り響いてすべてを破棄し、誰かが死亡します。
質問: この場合、第 2 段階に入る前に GC.Collect() を呼び出すのが賢明ではないでしょうか?
結局のところ、これら 2 つの段階が互いに時間的に重なることはなく、GC が収集できたすべての最適化と統計は、ここではほとんど役に立たないでしょう...
注: ご指摘のとおり、.NET はこのようなアプリケーションに最適なプラットフォームではないかもしれませんが、それはこの質問の範囲を超えています。その意図は、GC.Collect() 呼び出しがアプリケーションの全体的な動作/パフォーマンスを改善できるかどうかを明確にすることです。そのようなことを行う状況が非常にまれであることは誰もが同意しますが、GC は推測を試み、ほとんどの場合は完全にうまくいきますが、それでも推測にすぎません。
ありがとう。
python - Pythonの短整数
Pythonは、基盤となるシステムアーキテクチャに基づいて整数を自動的に割り当てます。残念ながら、メモリに完全にロードする必要がある巨大なデータセットがあります。
それで、Pythonにいくつかの整数(C ++'short'に相当)に2バイトだけを使用させる方法はありますか?
c++ - なじみのない大規模なコードベースのメモリ フットプリントを削減する
かなり大規模 (~2.2 MLOC) で、かなり古い (10 年以上前に開始された) C/C++ の Windows デスクトップ アプリケーションがあるとします。モジュールの約 10% は外部にあり、ソースはなく、デバッグ シンボルのみです。
アプリケーションのメモリ使用量を半分に減らすにはどうすればよいでしょうか? 少なくとも、メモリが消費されている場所を見つけるにはどうしますか?
database - LINQ-To-SQL でメモリ リークを回避するにはどうすればよいですか?
メモリ使用量に関して、LINQ-To-SQL でいくつかの問題が発生しています。Windows サービスで使用して何らかの処理を行っており、コンテキストから引き戻す大量のデータをループしています。はい - ストアド プロシージャを使用してこれを実行できることはわかっていますが、それが理想的なソリューションとは言えない理由があります。
とにかく、私が基本的に見ているのは、呼び出した後でもメモリが解放されていないことcontext.SubmitChanges()
です。そのため、一度に 100 レコードだけをプルバックしたり、複数のコンテキストを作成してそれらすべてに個別のタスクを実行させたりするなど、あらゆる種類の奇妙なことをしなければならなくなります。同じままにしDataContext
て後で他の呼び出しに使用すると、ますます多くのメモリが消費されます。Clear()
クエリが返す" " 配列を呼び出しvar tableRows
、null に設定して呼び出しSYstem.GC.Collect()
ても、メモリは解放されません。
今、私はあなたDataContexts
がそれらを素早く使用し、素早く処分する方法についていくつか読んだことがありますが、コンテキストにすべてのデータ(または特定のテーブルのすべての追跡データ)をメモリが空いていることを保証する特定のポイント。
メモリが解放されることを保証する手順を知っている人はいますか?
c# - .NET + 大量のメモリ トリックのコピー
昔は、メモリの大きなチャンクをある場所から別の場所にコピーするために (多くの場合、オフスクリーン フレームバッファをブリッティングするために) トリックが使用されていました。
C# で作業しているので、バイト配列 (サイズは約 32k) をあるメモリ ロケーションから別のメモリ ロケーションに毎秒約 60 回移動する必要があることがわかりました。
どういうわけか、ここでは for ループでのバイト単位のコピーは最適ではないと思います。
純粋に管理されたコードにとどまりながら、この種の作業を行うための良いトリックを知っている人はいますか?
そうでない場合は、P/Invoking を実行するか、アンセーフ モードに移行するつもりですが、クロス プラットフォームの理由から、できれば管理を続けたいと考えています。
編集: 楽しみのために書いたベンチマークコード:
バイト単位: 15.6192
ループあたり 4 バイト: 15.6192
ブロック コピー: 0
optimization - OS ブロック バッファにファイルを保持する
オペレーティング システムのブロック キャッシュにできるだけ多くの大きなファイルを保持する必要がありますが、それは RAM に収まりきらないほど大きく、別の非常に大きなファイルを継続的に読み込んでいます。ATM 別のファイルから読み取りをストリーミングするときに、システム キャッシュから大きな重要なファイルの大きなチャンクを削除します。
c++ - DLLのアンロード時にメモリリークが発生すると、ホストプロセスにリークが発生しますか?
この場合を考えてみましょう:
この時点で、malloc()の呼び出しで割り当てられた1kは、ホストプロセスで再び使用できるようになりますか?DLLはCRTに静的にリンクしています。
c# - .NET でメモリ リークを見つけるのに役立つ戦略とツールは何ですか?
私は C++ を 10 年間書きました。メモリの問題が発生しましたが、かなりの努力で修正できました。
ここ数年、私は C# を書いています。私はまだ多くのメモリの問題を抱えていることに気づきました。それらは非決定性のために診断と修正が困難であり、C# の哲学は、非常に確実に行う場合はそのようなことを心配する必要はないということです。
私が見つけた特定の問題の 1 つは、コード内のすべてを明示的に破棄してクリーンアップする必要があることです。そうしないと、メモリプロファイラーはあまり役に立ちません。なぜなら、表示しようとしているすべてのデータ内でリークを見つけることができないほど多くのチャフが浮かんでいるからです。私の考えが間違っているのか、それとも私の持っているツールが最適ではないのだろうか。
.NET でのメモリ リークに対処するには、どのような戦略とツールが役立ちますか?