2010-05-12 41 views
6

Tôi có một dịch vụ wcf rất nhỏ được lưu trữ trong một ứng dụng giao diện điều khiển.Dịch vụ WCF Rò rỉ bộ nhớ

[ServiceContract] 
public interface IService1 
{ 
    [OperationContract] 
    void DoService(); 
} 

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)] 
public class Service1 : IService1 
{ 
    public void DoService() 
    { 

    } 
} 

và hạnh phúc của nó gọi là

using (ServiceReference1.Service1Client client = new ServiceReference1.Service1Client()) 
{ 
    client.DoService(new DoServiceRequest()); 
    client.Close(); 
} 

Hãy nhớ dịch vụ được công bố trên basicHttpBindings.

Vấn đề

Bây giờ khi tôi thực hiện trên mã khách hàng trong một vòng lặp 1000 tôi tìm thấy sự khác biệt lớn giữa "Tất cả Heap byte" và "Bytes tư nhân" bộ đếm hiệu suất (i sử dụng profiler nhớ .net). Sau khi điều tra tôi thấy một số đối tượng không được xử lý đúng cách sau đây là danh sách các đối tượng đó (1000 ví dụ không được tìm thấy -> bằng với các cuộc gọi của khách hàng)

(không gian tên cho tất cả chúng là System.ServiceModel. các kênh)

HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream 
BodyWriterMessage 
BufferedMessage 
HttpRequestContext.ListenerHttpContext.ListenerContextHttpInput.ListenerContextInputStream 
HttpRequestContext.ListenerHttpContext 

Câu hỏi Tại sao chúng ta có rất nhiều đối tượng chưa ga và làm thế nào để kiểm soát chúng.

Xin vui lòng giúp

+1

Dường như thư viện hệ thống bị rò rỉ cho tôi. Mã khách hàng (như trong văn bản người dùng) không chạm vào các bộ đệm và luồng đó, và có vẻ như WCF không xử lý chúng. –

+0

Mabushar: Bạn có may mắn với điều này không? Tôi dường như có một vấn đề tương tự. – bugfixr

+0

@bugfixr xin lỗi anh trai tôi nhận thấy bạn tin nhắn ngày hôm nay, tôi không nhớ nếu tôi đã có thể thoát khỏi những người nhưng một điều tôi nhớ là tôi chuyển sang khuôn khổ 4.0 từ khuôn khổ 3.5, nó đã giúp một phần hoặc hoàn toàn tôi không nhớ nhưng nó đã giúp tôi bằng cách nào đó. xin lỗi vì trả lời muộn. –

Trả lời

0

Tôi đã tìm thấy giải pháp đó vào năm 2010 nhưng tôi đã quên đăng nó. Tôi thực sự bị mất chính xác theo dõi nhưng tôi nhớ nó đã được. Net thư viện lỗi đã được báo cáo cho microsoft và đã được thừa nhận bởi họ. Tôi không có liên kết của nó nhưng tôi sẽ đăng nó ngay sau khi tôi có thể tìm thấy nó. Dù sao Microsoft đã khắc phục sự cố này trong .net 4.0 và đó là giải pháp chính xác mà tôi đã theo dõi, tôi biết một số bạn có thể không thực hiện được do thay đổi môi trường máy chủ đôi khi không nằm trong tay bạn.

4

Bạn đang yêu cầu một thể hiện mới cho mỗi cuộc gọi (InstanceContextMode = InstanceContextMode.PerCall). Nếu không có GC xảy ra trong 1000 cuộc gọi thì các cá thể dịch vụ sẽ không bị thu thập. WCF yêu cầu bạn thực hiện IDisposable

Từ MSDN : Discover Mighty Instance Management Techniques For Developing WCF Apps

Per-Gọi Dịch vụ mỗi cuộc gọi dịch vụ Windows Communication Foundation chế độ instantiation mặc định. Khi loại dịch vụ được cấu hình cho kích hoạt từng cuộc gọi, một cá thể dịch vụ, một đối tượng thời gian chạy ngôn ngữ chung (CLR), chỉ tồn tại trong khi đang thực hiện cuộc gọi khách. Mọi yêu cầu của khách hàng đều nhận được một cá thể dịch vụ chuyên dụng mới. Hình 2 minh họa cách kích hoạt một cuộc gọi đơn này hoạt động.

Figure 2 Per-Call Instantiation http://i.msdn.microsoft.com/cc163590.fig02(en-us).gif

  1. Khách hàng gọi proxy và ủy quyền chuyển tiếp cuộc gọi đến dịch vụ .
  2. Windows Communication Foundation tạo một dịch vụ phiên bản và gọi phương thức trên đó.
  3. Sau khi gọi phương thức trả về, nếu đối tượng thực hiện Có thể sử dụng được, sau đó Windows Communication Foundation gọi IDisposable.Dispose on it.
+1

Tôi đã xem bài viết này trước đây và đúng là nó gọi phương thức Vứt bỏ tự động nếu có và đây chỉ là nếu bạn đã tự mở tài nguyên và cần dọn dẹp trong trường hợp này, bạn phải tự dọn dẹp chúng. Nhưng trong trường hợp của tôi tôi không có tài nguyên để làm sạch. Tuy nhiên tôi đã cố gắng này nhưng kết quả tương tự. Hơn nữa tôi muốn nói với bạn rằng GC đã làm sạch bộ nhớ Heap nhưng Native không được làm sạch do các đối tượng đó đã được thu thập. –

1

Bạn có vô tình bật các bộ đếm hiệu suất không? Như dưới đây?

<system.serviceModel> 
    <diagnostics performanceCounters="All" /> 
    .. 
</system.serviceModel> 

Trong đoạn "Tăng Kích thước bộ nhớ cho đếm hiệu suất", từ liên kết này: http://msdn.microsoft.com/en-us/library/ms735098.aspx

có đề cập đến một Bytes tư nhân "giả mạo" đếm khi đếm hiệu suất WCF được kích hoạt. Thay đổi nó thành ServiceOnly hoặc hoàn toàn vô hiệu hóa nó (Tắt) có thể làm các trick.