Tôi đang sử dụng Delphi 2009 có trình quản lý bộ nhớ FastMM4 được tích hợp sẵn trong đó.Tại sao bộ nhớ chương trình Delphi của tôi tiếp tục phát triển?
Chương trình của tôi đọc và xử lý tập dữ liệu lớn. Tất cả bộ nhớ được giải phóng một cách chính xác bất cứ khi nào tôi xóa bộ dữ liệu hoặc thoát khỏi chương trình. Nó không có rò rỉ bộ nhớ nào cả.
Sử dụng CurrentMemoryTùy dụng sử dụng được đưa ra trong câu trả lời của spenwarr cho: How to get the Memory Used by a Delphi Program, tôi đã hiển thị bộ nhớ được FastMM4 sử dụng trong khi xử lý.
Điều gì dường như đang xảy ra là bộ nhớ được sử dụng đang tăng lên sau mỗi chu kỳ và chu kỳ phát hành. ví dụ:
1,456 KB được sử dụng sau khi bắt đầu chương trình của tôi mà không có tập dữ liệu.
218,455 KB được sử dụng sau khi tải tập dữ liệu lớn.
71,994 KB sau khi xóa hoàn toàn tập dữ liệu. Nếu tôi thoát ra tại thời điểm này (hoặc bất kỳ điểm nào trong ví dụ của tôi), không có rò rỉ bộ nhớ nào được báo cáo.
271,905 KB được sử dụng sau khi tải lại cùng một tập dữ liệu.
125,443 KB sau khi xóa hoàn toàn tập dữ liệu.
325,519 KB được sử dụng sau khi tải lại cùng một tập dữ liệu.
179,059 KB sau khi xóa hoàn toàn tập dữ liệu.
378,752 KB được sử dụng sau khi tải lại cùng một tập dữ liệu.
Dường như việc sử dụng bộ nhớ của chương trình của tôi đang tăng khoảng 53,400 KB theo mỗi chu kỳ tải/xóa. Trình quản lý tác vụ xác nhận rằng điều này thực sự đang diễn ra.
Tôi đã nghe nói rằng FastMM4 không phải lúc nào cũng giải phóng toàn bộ bộ nhớ của chương trình về hệ điều hành khi các đối tượng được giải phóng để nó có thể giữ bộ nhớ xung quanh khi cần. Nhưng điều này liên tục phát triển làm phiền tôi. Vì không có rò rỉ bộ nhớ nào được báo cáo, tôi không thể xác định được sự cố.
Có ai biết tại sao điều này xảy ra, nếu điều đó xấu, và nếu có bất cứ điều gì tôi có thể hoặc nên làm gì?
Cảm ơn dthorpe và Mason cho câu trả lời của bạn. Bạn đã cho tôi suy nghĩ và thử những điều khiến tôi nhận ra mình đang thiếu một cái gì đó. Quá trình gỡ lỗi chi tiết là bắt buộc.
Khi nó quay ra, tất cả các cấu trúc của tôi đã được giải phóng thích hợp khi thoát. Nhưng việc phát hành bộ nhớ sau mỗi chu kỳ trong thời gian chạy là không. Nó đang tích lũy các khối bộ nhớ mà thông thường sẽ gây ra một rò rỉ có thể phát hiện được khi thoát ra nếu việc dọn dẹp của tôi không chính xác - nhưng đúng vậy.
Có một số StringLists và các cấu trúc khác mà tôi cần để xóa giữa các chu kỳ. Tôi vẫn không chắc chắn làm thế nào chương trình của tôi làm việc một cách chính xác với các dữ liệu bổ sung vẫn còn đó từ các chu kỳ trước đó nhưng nó đã làm. Tôi có lẽ sẽ nghiên cứu thêm.
Câu hỏi này đã được trả lời. Cảm ơn bạn đã giúp đỡ.
IMHO, bạn nên thêm câu trả lời và chấp nhận thay vì chỉnh sửa câu hỏi. Sẽ dễ dàng hơn nếu ai đó tìm kiếm câu hỏi, câu trả lời và học hỏi từ kinh nghiệm của bạn. – EMBarbosa