2011-09-28 35 views
7

Có dịch vụ lưu trữ tự WCF phải hoạt động 99% thời gian. Đôi khi chúng ta có một số rắc rối bộ nhớ như thế này:Các sự cố bộ nhớ heap

memory leaks

Nhưng dịch vụ đang làm việc như bình thường sau đó vấn đề này. Làm thế nào chúng ta có thể quản lý điều này? Bất kỳ lời khuyên và điểm để làm cho dịch vụ mạnh mẽ mà sẽ tồn tại trong khác nhau, ngoại trừ các tình huống rất rất hoan nghênh.

+0

Bạn có mã được quản lý thuần túy hay bạn có mã không được quản lý hoặc interop không? –

+0

Tất cả mã đều được quản lý. Và chúng tôi sử dụng [dotConnect for Oracle from devArt] (http://www.devart.com/dotconnect/oracle/) làm thư viện lớp dữ liệu. – kseen

+0

Tại sao bạn lại bôi đen kết xuất ASCII? Bạn biết nó có thể được xây dựng lại hoàn toàn bằng cách sử dụng các mã bên trái? – Dani

Trả lời

3

Tôi không chắc chắn vị trí của sự cố nhưng sự rò rỉ bộ nhớ có thể là lý do.

Tất cả mã đều được quản lý. Và chúng tôi sử dụng dotConnect cho Oracle từ devArt là thư viện lớp dữ liệu.

Bạn cho rằng tất cả mã đều được quản lý nhưng có thể là các phần không được quản lý. Tuy nhiên, bạn phải gọi phương thức Vứt bỏ cho tất cả các đối tượng dùng một lần sau khi sử dụng chúng, đừng nghĩ rằng chúng được vứt bỏ đúng cách khi chúng nằm ngoài phạm vi. Thực hành tốt nhất là, không để cho các đối tượng dùng một lần rời khỏi phạm vi mà không gọi phương thức Vứt bỏ của chúng. Bạn có thể sử dụng các câu lệnh 'using' nếu bạn sử dụng chúng như là các biến cục bộ.

DbConnection là một ví dụ tốt cho các đối tượng dùng một lần, đảm bảo bạn vứt bỏ tất cả các kết nối (đối tượng dùng một lần).

+2

+1, lời khuyên tốt, Oracle DAL yêu cầu Dispose vì họ sử dụng mã không được quản lý. Thật đáng tiếc vì việc xử lý các kết nối Oracle và các lệnh thường là hoạt động tốn nhiều thời gian nhất trong một ứng dụng (IMHE) –

0

Nếu đó là vấn đề WCF (tôi không biết phải làm gì với bãi chứa của bạn), tôi đề nghị bạn kích hoạt truy tìm phía máy chủ WCF và xem ngoại lệ nếu có (và chỉnh sửa câu hỏi của bạn chúng tôi có thể giúp bạn thêm).

Dưới đây là một liên kết mà giải thích làm thế nào để làm điều này:

How to enable WCF tracing

0

Dịch vụ Hành vi của bạn đặc biệt ConcurrencyMode và InstanceContextMode là gì.

nếu bạn có Nhiều như ConcurrencyMode và InstanceContext được đặt thành (PerCall, hoặc PerSession (mặc định)), bạn có thể chắc chắn gặp sự cố nếu bạn có DataStructures lớn hoặc tài nguyên không rõ ràng.

nếu bạn đang sử dụng nhiều truy cập đồng thời cố gắng InstanceContextMode Độc [ServiceBehavior (ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]

0

Bạn có 100% không ai trong số bạn phụ thuộc có mã không được quản lý? Tôi đã nhìn thấy một cái gì đó rất giống với điều này xảy ra, và nó đã xảy ra bởi vì chúng tôi đã deallocating bộ nhớ rằng một quá trình cũng sẽ cố gắng để deallocate sau này.

Các vấn đề liên quan