2011-10-21 24 views
8

Đây là một câu hỏi tiếp theo để my previous question.Điều gì có thể gây rò rỉ phần xử lý?

Như đã đề cập trong this answer to my previous question, tôi sử dụng ProcessExplorer để phân tích một danh sách các xử lý đơn xin của tôi đang sử dụng để tìm một xử lý rò rỉ.

Tay cầm bị rò rỉ thuộc loại Mục.

Chính xác phần xử lý là gì, nó được sử dụng ở đâu và điều gì có thể làm cho các phần xử lý bị rò rỉ?

Tôi hiện không sử dụng tệp được ánh xạ bộ nhớ trong mã của mình.

+0

Bạn đang không sử dụng tệp được ánh xạ bộ nhớ, có phải ai đó khác không? Bạn đang sử dụng thành phần nào? Bất kỳ dll của bên thứ ba? – Harriv

Trả lời

4

Trích dẫn Bên trong của Windows Mark Russinovich 2000 (mà ngày nay được gọi là Windows Internals),

Các phần đối tượng, mà hệ thống con Win32 gọi một tập tin ánh xạ đối tượng, đại diện cho một khối bộ nhớ mà hai hoặc nhiều quy trình có thể chia sẻ.

Vì vậy, đó là tệp bộ nhớ được ánh xạ. Chúng sẽ bị rò rỉ nếu bạn tạo một tệp ánh xạ bộ nhớ và không đóng được. Khá khó để cụ thể hơn nhiều.

+1

Cảm ơn. Tin xấu là: Tôi không sử dụng các tệp ánh xạ bộ nhớ nào cả: ( – jpfollenius

2

Tệp bộ nhớ ánh xạ không được liên kết với bộ xử lý tệp có thể được sử dụng cho IPC (giao tiếp giữa quá trình). Nếu bạn không sử dụng chúng trực tiếp, có lẽ một trong các đơn vị hoặc thành phần của bạn đang thực hiện một số giao tiếp IPC. Rất có thể bạn sử dụng một thành phần để kết nối với một quy trình khác và không giải phóng nó theo yêu cầu.

Hành động đầu tiên cần thực hiện là theo dõi bất kỳ rò rỉ bộ nhớ nào (sử dụng chế độ gỡ lỗi FastMM4), và bạn chắc chắn sẽ tìm thấy một số đối tượng không được giải phóng trong mã của bạn.

Vì xử lý thường được phân bổ bởi các đối tượng, từ thử nghiệm của tôi, giải quyết tất cả các rò rỉ bộ nhớ sẽ giải quyết rò rỉ xử lý.

Nếu bạn không bị rò rỉ bộ nhớ, có một số cuộc gọi CreateFileMapping() để kiểm tra CloseHandle() tương ứng trong tất cả mã nguồn của bạn (bao gồm cả nguồn của bên thứ ba).

3

Nó chỉ ra rằng vấn đề ở trong một hàm cấp thấp tính số lượng các luồng của quy trình hiện tại. Hàm này sử dụng hàm số

CreateToolhelp32Snapshot 

API trả về một tay cầm không được đóng đúng cách. Tôi không chắc chắn lý do tại sao điều này tạo ra một phần xử lý rò rỉ mặc dù.

+0

Phải, nhưng đó là một lời giải thích khá bất ngờ cho phần xử lý rò rỉ, vì vậy nó trả lời ít nhất một phần của câu hỏi. – jpfollenius

1

Phần xử lý rò rỉ trong .net là do Microsoft Hotfix KB2670838. Gỡ cài đặt bản cập nhật này và phần xử lý sự cố rò rỉ (Hết bộ nhớ) sẽ được sửa.

Parameter is not valid. at System.Drawing.Image.get_Width() 
at System.Drawing.Image.get_Size() 
Các vấn đề liên quan