2009-09-17 35 views
6

liên quan đến câu hỏi trước đây của tôi:
Preventing Memory issues when handling large amounts of textLàm thế nào tôi có thể xác định có bao nhiêu bộ nhớ chương trình của tôi hiện đang chiếm

Có cách nào để xác định bao nhiêu không gian bộ nhớ chương trình của tôi là chiếm ? Tôi sẽ xử lý một lượng lớn tệp văn bản và thường lưu trữ các đối tượng đã xử lý trong bộ nhớ. Có những lúc sẽ có quá nhiều thông tin, và tôi sẽ hết bộ nhớ. Tôi có một giải pháp để tránh các vấn đề phân bổ bộ nhớ, nhưng tôi chỉ muốn sử dụng nó khi cần thiết, để tránh phân trang, mà cuối cùng sẽ làm giảm hiệu suất của tôi khi nó không cần thiết. Có cách nào để tìm ra bao nhiêu bộ nhớ tôi đang chiếm, để tôi có thể trang thông tin của tôi chỉ khi cần thiết?

LƯU Ý: Tôi đang tìm một giải pháp mà chương trình của tôi có thể sử dụng để bắt đầu phân trang khi cần thiết.

Trả lời

5

Bạn có thể thử GC.GetTotalMemory:

Lấy số byte hiện nghĩ được phân bổ. Tham số cho biết phương thức này có thể chờ một khoảng thời gian ngắn trước khi quay lại, để cho phép hệ thống thu thập rác và hoàn thành đối tượng.

Điều quan trọng cần lưu ý là phần này: "Truy xuất số byte hiện được cho là được phân bổ". Điều này có nghĩa rằng phương pháp này có thể không chính xác 100% - miễn là bạn biết điều này xảy ra, bạn sẽ có thể có được một ý tưởng thô về việc sử dụng bộ nhớ ảo của bạn tại một điểm nhất định trong việc thực thi ứng dụng của bạn.

Chỉnh sửa: Hãy để tôi cung cấp một giải pháp khác có thể sẽ hiệu quả hơn: sử dụng perfmonCLR performance counters.

+0

> "[...] xấp xỉ tốt nhất hiện có của số byte hiện phân bổ trong bộ nhớ được quản lý" này wont nhận được số lượng bộ nhớ được sử dụng bởi tất cả các hội đồng quản lý? –

+0

Có, nhưng sẽ chỉ có trong AppDomain hiện tại. Tôi khuyên bạn nên sử dụng perfmon cho loại điều này. –

3

Bạn thực sự cần sử dụng mã Profiler. Những điều này sẽ cho bạn biết chính xác những gì đang xảy ra, nơi bộ nhớ đang được sử dụng hết, v.v.

FYI: Nó hiếm khi bạn nghĩ như vậy.

byte
+0

+1: mặc dù nó không hoàn toàn thỏa mãn câu hỏi của bạn (vì bạn muốn làm điều đó trong mã), điều này vẫn đúng; profiling vẫn phải là một bước trong thiết kế của bạn vì nó sẽ chiếu sáng các khía cạnh của việc sử dụng bộ nhớ có thể bị che khuất bởi các phép đo có thể truy cập mã. Ví dụ, 'WorkingSet64' bao gồm bộ nhớ chia sẻ, mà bạn có thể muốn trừ khỏi tổng số khi quyết định có nên trang hay không. –

7
long bytes = System.Diagnostics.Process.GetCurrentProcess().WorkingSet64;
3

dài = System.Diagnostics.Process.GetCurrentProcess(). WorkingSet64 để biết thêm See Here

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