2010-06-12 25 views
14

Ứng dụng của tôi chạy trong vài giờ, Không tăng bất kỳ giá trị nào (vmsize, bộ nhớ) của Trình quản lý tác vụ. Nhưng sau vài giờ tôi bị lỗi bộ nhớ."Kích thước ảo" trong trình thám hiểm quá trình sysinternals

Trong sysinternals tôi thấy rằng "Virtual Size" đang tăng lên đáng kể, và khi nó đạt khoảng 2 GB tôi bắt đầu nhận được lỗi bộ nhớ.

Vì vậy, loại rò rỉ bộ nhớ nào? Làm thế nào tôi có thể chứng minh nó bằng mã? Có thể sao chép cùng một thứ với bất kỳ đoạn mã nào mà không giá trị bộ nhớ nào tăng lên nhưng chỉ kích thước ảo trong trình thám hiểm quá trình sysinternsl tăng?

cảm ơn mọi đề xuất

+0

Câu hỏi đó phải có thẻ Windows. Tôi đã khá cám dỗ để trả lời từ Linux pov;) – Dummy00001

Trả lời

4

Từ âm thanh của mọi thứ, bạn đang hết dung lượng địa chỉ. Windows 32 bit chia tách không gian địa chỉ trong một nửa, một nửa cho chương trình người dùng và một nửa cho hệ thống, vì vậy mỗi hệ thống nhận được 2 Gigabyte.

Nguyên nhân phổ biến nhất của việc này là phân mảnh không gian bộ nhớ đến mức bạn không thể tìm thấy một đoạn đủ lớn để phân bổ. Thật không may, mà không biết nhiều hơn về những gì bạn đang làm, thật khó để đoán tại sao điều đó có thể xảy ra.

8

Kích thước ảo là số trang mà quy trình đã phân bổ, những trang hiện không nằm trong bộ làm việc (được tải trong RAM) sẽ nằm trong tệp trang của hệ thống.

Thông thường bạn phân bổ bộ nhớ không được giải phóng. Điều này có thể khó theo dõi trong mã mà không có các công cụ đặc biệt như Rational Purify hoặc Boundschecker chẳng hạn. Với sysinternals bạn thấy rằng phải có rò rỉ nhưng nó sẽ không có nghĩa là cho bạn biết nơi ...

Nếu phần mềm của bạn không quá lớn, bạn có thể thử đăng xuất "mới" và "xóa" và xem nếu có quá nhiều đối tượng trong bộ nhớ bằng cách quản lý danh sách các đối tượng được cấp phát (làm cho trình gỡ rối bộ nhớ của riêng bạn để nói). Có một số người trợ giúp trong thế giới cửa sổ như CRT memory checking utils from Microsoft. Chúng hữu ích trong một số trường hợp.

2

Theo this thread trên diễn đàn Sysinternals, kích thước ảo tương ứng với không gian địa chỉ của quá trình này (Tôi đoán các trang đã cam kết và dè dặt của bộ nhớ)

1

Dường như ảo Kích bao gồm các trang với các loại sau đây được phân bổ: MEM_MAPPED (đối với quan điểm dữ liệu) MEM_IMAGE (cho xem hình ảnh thực thi) MEM_PRIVATE (thông thường được phân bổ bộ nhớ trang)

Nó không phải là chỉ có "bộ nhớ" cho dữ liệu, nhưng cũng bao gồm không gian trang cho * .dll-s và FileMapping cơ chế.

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