0

私のプロセスでは、10 個のスレッドを作成し、アプリケーションが有効になるまでそれらのスレッドを使用します。各スレッドは、毎回何らかのファイル入出力操作を実行します。したがって、問題は、スレッドが実行を開始するたびに、プロセスの仮想メモリが増加することです。私の分析では、1 つのファイル入出力タスクがスレッドに許可されると、スレッドがファイルのコピーを開始したときにファイルがスレッド アドレス空間にロードされ、コピーが完了した後、スレッド アドレス空間はまだスレッドとしてクリアされません。終了していません。したがって、スレッドに別のタスクをもう一度割り当てると、新しいファイルがスレッドのアドレス空間にロードされます。

したがって、メイン プロセスの仮想メモリ アドレス空間が増加します。SO私が間違っている場合は修正してください。また、プロセスがログ時間で実行された場合に問題があることを知るのにも役立ちます。

4

1 に答える 1

0

ここでいくつかのこと。

1) スレッドには独自のメモリ アドレス空間がありません。プロセスが行います。(ただし、スレッドは独自のスレッド ローカル ストレージを取得します。)

2) マネージ言語では、ガベージ コレクターが実行されるまで、オブジェクトはクリーンアップされず、ヒープは圧縮されません。ガベージ コレクタは、必要になるまで実行されません (たとえば、プログラムのメモリが不足しそうになるなど)。オブジェクトがそれへの強い参照を持っていない限り (実行中のものがオブジェクトに到達できない場合)、オブジェクトはプログラムがクリーンアップする必要があるときにクリーンアップされ、他に何もする必要はありません。ただし、ガベージ コレクタを早く実行したい場合は、実行するように指示してください。

ところで、多くの異なるスレッド間で共通してリソースが必要な場合は、何らかのグローバル キャッシュを用意することを検討できます。ただし、初期の最適化は重大な罪であるため、実際の問題を解決できると判断するまでは、そのような努力をしないでください。

于 2013-01-22T05:02:10.880 に答える