2012-02-20 43 views
26

Tôi đang tìm kiếm một số rò rỉ bộ nhớ trong một dịch vụ chạy dài (sử dụng F #) ngay bây giờ. Các chỉ "lạ" điều tôi đã thấy cho đến nay như sau:rò rỉ bộ nhớ trong Microsoft.FSharp.Control.Mailbox?

  • tôi sử dụng một MailboxProcessor trong một hệ thống con với một QueueChannelCommands đại số-datatype tên (nhiều hơn hoặc ít hơn một bó của chương trình Add/Nhận lệnh - một số Với AsyncReplyChannels đính kèm)
  • khi tôi cấu hình dịch vụ (sử dụng Ants Memory Profiler) Tôi thấy các thể hiện của mảng được đề cập (hầu hết có chiều dài 4, nhưng đang phát triển) - tất cả trống (null) có tham chiếu dường như được giữ bởi Control. Hộp thư: enter image description here

Tôi không thể nhìn thấy bất kỳ bọ chét nào vào trong mã của tôi cho hành vi này (mã tiêu chuẩn của bạn, bạn có thể thấy ở mỗi Mailbox-ví dụ ra có - chỉ là một vòng lặp với một let! = receivematch để làm theo kết thúc với một return! loop()

Có ai nhìn thấy loại hành vi trước hoặc thậm chí biết làm thế nào để xử lý này? Hoặc đây có phải là lỗi (đã biết) không?

Cập nhật: sự phát triển của các mảng thực sự là lạ - có vẻ như có thêm không gian nối mà không beeing sử dụng đúng cách: enter image description here

+0

mảng có vẻ là "mailbox.arrivals" nội bộ của MailboxProcessor nếu điều này là bất kỳ sự giúp đỡ – Carsten

+1

Dave Thomas nhận thấy một hành vi tương tự khi ông sử dụng 'trở lại! loop() 'bên cạnh khối try/catch: http://moiraesoftware.com/blog/2011/12/11/fixing-a-hole/. Tôi không nghĩ đó là trường hợp với chương trình của bạn. – pad

+0

có cảm ơn bạn - Tôi biết về vấn đề này, nhưng điều này dẫn đến chi phí cao hơn nhiều (ông đã tìm thấy rất nhiều công cụ Async), tương tự như khi nào! thay vì trả lại! được sử dụng - ở đây tôi chỉ thấy các mảng trống, đang phát triển mà không có bất kỳ vấn đề không đồng bộ nào. – Carsten

Trả lời

-5

NET có thu gom rác riêng của mình, trong đó hoạt động khá độc đáo. Cách phổ biến nhất để gây rò rỉ bộ nhớ trong các công nghệ .NET là bằng cách thiết lập các đại biểu và không loại bỏ chúng trên các đối tượng deconstructors.

+0

Tôi nghĩ rằng khá an toàn khi cho rằng người hỏi câu hỏi biết điều này, đánh giá từ câu hỏi. Ngoài ra, câu trả lời của bạn không liên quan gì đến MailboxProcessor, và thậm chí ít hơn đến vấn đề cụ thể (mảng và sự tăng trưởng của chúng). – ShdNx

+0

Thật vậy tôi làm cộng: nếu việc thực hiện MailboxProcessor không làm gì hơn không ai dây bất kỳ sự kiện (tôi đoán đó là những gì có nghĩa là) ở đây – Carsten

+0

Đây chỉ là một bình luận nhỏ về quản lý rò rỉ bộ nhớ trong .NET. –

2

Tôi không phải là F # chuyên gia bằng bất kỳ phương tiện nhưng có lẽ bạn có thể nhìn vào các câu trả lời đầu tiên trong chủ đề này:

Does Async.StartChild have a memory leak?

Câu trả lời đầu tiên đề cập đến một hướng dẫn cho bộ nhớ profiling ở trang sau:

Nhưng họ đề cập đến mã nguồn mở này đã rsion của F #

Và tôi không chắc chắn đó là những gì bạn đang tìm kiếm (về phiên bản mã nguồn mở này của F # trong điểm cuối cùng), nhưng có lẽ nó có thể giúp bạn tìm nguồn rò rỉ hoặc chứng minh rằng nó thực sự đang rò rỉ bộ nhớ.

Hy vọng rằng có thể giúp bằng cách nào đó?

Tony