3

わかった。何が原因なのか完全にはわかりませんが、関連していると思われる要因を説明しようと思います。誰かが助けてくれることを願っています! また、不足している可能性のあるものについては、喜んでお答えします。問題のコードを簡単に説明すると、次のようになります。

  • ITextSharp を使用して、PDF でいっぱいのフォルダー内のページ数などを確認します。
  • スレッド化に task.factories を使用します (基本的に、メイン サブは「pdf カウント」サブを呼び出し、カウント サブは interlocked.add を使用してページをパブリック変数に追加します)。
  • 私は非常によく似たプロセス (別のライブラリを使用) を使用して、Tiff ファイルに対して同じことを行います。同じ問題はないようです。
  • 最初にプログラムを閉じずに (ファイルを再度カウントするだけで) プログラムを再実行すると、タスク マネージャーのメモリ使用量は最初は少し減少しますが、最終的には前回の反復よりも高くなります。それには上限があるようですが、実際にはテストしていません。
  • プログラムが完了すると、プロセッサの使用率は通常に戻ります。

私が遭遇した問題は、タスク マネージャーでプログラムに割り当てられたメモリが、これを行っているときに非常に急速に不均衡に大きくなることです (これを実行すると、通常は 300 ~ 700 mb になります)。数百のファイルを処理します)。また、プログラムが「完了」してフォームに結果を表示するだけの場合でも、そのレベルのメモリ使用量を維持し続けます。タスク、スレッドなどを見ると、プログラムが「完了」すると、すべて正常に見えます。しかし、何らかの形で、何かがまだメモリのどこかに保存されているようです。

サブが終了したときにガベージコレクションがクリーンアップを処理する必要があるというのは、私の漠然とした理解ですよね? 次のような単純な Using ステートメントを実行しようとしても、

    Using PDFDocx As PdfReader = New PdfReader(PDFToCount)
        Dim Pges As Integer = PDFDocx.NumberOfPages
        Interlocked.Increment(Pges)
    End Using

まったく違いがないようです。マネージド コードとアンマネージド コードの全体的な理解は、せいぜいあいまいです。この DLL は管理されていないコードを構成しますか? もしそうなら、それはどういうわけか問題ですか? タスク マネージャーでのメモリ割り当ては、どういうわけか目の錯覚ですか? または、私のようにタスク ライブラリを使用していることが問題の原因である可能性はありますか? 私はこれがすべて少しあいまいであることを理解しています.私は喜んでできる限りの情報を記入します.

編集: フォローアップとして、この記事http://www.codeproject.com/Articles/42721/Best-Practices-No-5-Detecting-NET-application-memoを使用して、DebugDiag を使用し、その結果を得ることができました。次のことを示しているようです:

Function   clr!CExecutionEngine::ClrVirtualAlloc+4a 
Source Line    
Allocation type   Virtual memory allocation(s) 
Allocation Count   12 allocation(s) 
Allocation Size   1.8 GBytes 
Leak Probability   50% 

問題の責任者です。新しい情報に基づく提案はありますか?

4

1 に答える 1

1

Perfmon を使用して、.NET アプリケーションでメモリ リークが発生しているかどうか (マネージまたはアンマネージ) を判断できます。

Perfmon.exe を実行し、次のカウンターを追加します。

  • プロセス/プライベート バイト
  • .NET CLR メモリ / すべてのヒープの # バイト
  • .NET CLR LocksAndThreads / 現在の論理スレッドの数

アプリケーションを代表的な時間実行し、その機能を実行します。

プライベート バイトが増加しているが、すべてのヒープの # バイトが増加していない場合は、アンマネージ メモリがリークしています。両方が増加している場合は、マネージド メモリがリークしています。

現在の論理スレッドの数が予想を超えて増加している場合は、スレッド スタックがリークしています。

Private Bytesが定期的に 1MB ずつ増加し、それに対応して現在の論理スレッド数が増加している場合は、スレッド スタック リークが原因である可能性があります。

ここから。

于 2013-10-13T01:56:58.720 に答える