2012-02-01 53 views
8

Bên trong ứng dụng đa luồng phức tạp Tôi đang đánh một ngoại lệ ngoài bộ nhớ có thể mỗi tuần một lần. Ứng dụng này đang gửi/đọc một lượng lớn dữ liệu qua một số ổ cắm, nơi dữ liệu đọc được lưu trữ để tránh tràn bộ đệm thẻ mạng.
Chiến lược tốt nhất để phân tích ngoại lệ bộ nhớ là gì? Trong thời gian chạy bình thường, Ứng dụng được hiển thị với kích thước "Tổng số byte trong tất cả các Heap" lên tới 1,5 Gigabyte trong Trình khám phá quy trình.
Nó có thể là một chiến lược để có một sợi đó là bỏ phiếu hoặcC# Hết bộ nhớ ngoại lệ - chiến lược cảnh báo

GC.GetTotalMemory()

hoặc

PrivateMemorySize64()

một lần thứ hai để biết khi nào nên bắt đầu phân tích mọi thứ? Tôi đã không nhìn vào profilers thương mại được nêu ra và tôi là một chút lo ngại về tác động hiệu suất của họ mà có thể cho kết quả cũng sai về phân tích vấn đề thực tế.

+1

Bộ nhớ đệm của bạn hoạt động như thế nào? Tôi sẽ xem xét một chiến lược phân bổ khác cho bộ nhớ đệm của bạn. – CodesInChaos

+0

Để làm rõ, bạn có biết nguyên nhân gây ra ngoại lệ bộ nhớ và bạn đang tìm kiếm một cách để cấu hình bộ nhớ đệm trong ứng dụng của bạn để điều này không xảy ra? Hoặc là nó mà bạn không biết chính xác những gì gây ra nó và bạn muốn tot gỡ lỗi vấn đề? – svick

Trả lời

3

Bộ nhớ của bạn có thể bị phân mảnh khỏi nhiều thao tác chuỗi hoặc các thao tác khác tạo và giải phóng các khối bộ nhớ nhỏ, chẳng hạn như boxing/unboxing.

Bạn sẽ nhận được ngoại lệ này khi CLR không thể cấp phát một khối bộ nhớ miễn phí đủ lớn.

Tôi sử dụng "CLR Profiler" và kiểm tra cấp phát bộ nhớ. Nếu bạn thấy nhiều đốm trắng (khối tự do) và không có khối lớn miễn phí thì bạn cần bắt đầu xem cách bạn đang phân bổ các đối tượng.

Ví dụ: trước khi gán một chuỗi cho chuỗi khác, hãy kiểm tra xem các chuỗi có khác nhau trước hay không. Sử dụng StringBuilder là tất cả các trường hợp, loại bỏ quyền anh và tối ưu hóa bộ nhớ khác.

Tôi sử dụng kỹ thuật này và loại bỏ hoàn toàn các trường hợp ngoại lệ, ngoại trừ một vấn đề đã biết với việc hủy tuần tự nhị phân.

Tái khám phá nghệ thuật bị mất của Tối ưu hóa bộ nhớ trong Bộ luật quản lý của bạn tại http://msdn.microsoft.com/en-us/magazine/cc163856.aspx

tra Memory vấn đề tại http://msdn.microsoft.com/en-us/magazine/cc163528.aspx

Performance Optimization trong Visual Basic.NET tại http://msdn.microsoft.com/en-us/library/aa289513 (v = vs.71) .aspx

+2

Hầu hết các chuỗi phải được định vị lại và do đó không được gây ra phân mảnh bộ nhớ. LoH phân mảnh có thể là một vấn đề, nhưng nếu bạn đang sử dụng nhiều dây đủ lớn để kết thúc trên LoH bạn có thể làm điều gì đó sai trái. – CodesInChaos

+0

Bạn có ý gì khi tối ưu hóa bộ nhớ khác? Ở một phần, tôi đang sử dụng nhiều phân chia, regex, ngăn xếp và danh sách. Cần kiểm tra lại quyền anh ta – weismat

+0

Bạn không thể di dời bộ nhớ nếu không có khối đủ lớn. Đó là lý do tại sao ngoại lệ out-of-bộ nhớ được ném. Tôi chưa bao giờ thấy LOH gây ra ngoại lệ ngoài bộ nhớ. Đó là những gì nó cho, một đống là khối lớn bộ nhớ có thể được phân bổ mà không cần phải tìm một khối liên tục lớn miễn phí của bộ nhớ. – AMissico

0

Làm cách nào để sử dụng tham chiếu yếu cho bộ đệm ẩn? clicky

+3

Chỉ cần FYI, đây là từ Guildlines References yếu: "Tránh sử dụng các tham chiếu yếu như một giải pháp tự động cho các vấn đề quản lý bộ nhớ. Thay vào đó, hãy phát triển một chính sách bộ nhớ đệm hiệu quả để xử lý các đối tượng của ứng dụng của bạn." –

+0

Không có quá nhiều nơi mà các tham chiếu yếu có thể giúp - tôi nghĩ rằng tôi sẽ chia quy trình thành hai đầu tiên để tăng gấp đôi không gian dữ liệu có sẵn. Tôi đã tránh điều này vì lý do hành chính cho đến nay. – weismat

1

Bạn có thể cân nhắc cài đặt các công cụ gỡ rối cho các cửa sổ và sử dụng adplus

ADPlus.vbs (ADPlus) là một công cụ từ Microsoft Dịch vụ Hỗ trợ Sản phẩm (PSS) có thể khắc phục sự cố bất kỳ quá trình hoặc ứng dụng mà dừng trả lời (bị treo) hoặc không thành công (bị treo).

Về cơ bản, bạn có thể đặt chế độ xem ứng dụng và khi nó gặp sự cố, nó sẽ chụp một kết xuất, sau đó bạn có thể phân tích bằng WinDBG/SOS.

+0

Tôi có thể đi tuyến đường này - tôi đoán tôi sẽ thêm nó vào danh sách nhiệm vụ được lên lịch của tôi, vì vậy nó sẽ bắt đầu hàng ngày vì mỗi ngày sẽ yêu cầu khởi động mới (như .exe cũng bắt đầu hàng ngày). – weismat

1

Bạn có thể sử dụng một MemoryFailPoint để thử và cung cấp cho bạn một số đảm bảo về một hoạt động trao

Nhưng tôi khuyên bạn nên cô lập quá trình mà ứng dụng của bạn đang chạy trong, chuyển sang 64 bit nếu đó là một lựa chọn và bạn có thể cần phải xem xét việc giảm một số hiệu suất để cung cấp cho bạn sự đảm bảo hợp lý về việc sử dụng bộ nhớ của bạn.

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