Có thể có liên quan rằng Perl không bao giờ cung cấp cho bộ nhớ tự quay trở lại hệ thống: Tất cả lên đến malloc()
và tất cả các quy tắc liên quan đến điều đó.
Biết cách malloc()
cấp phát bộ nhớ là quan trọng để trả lời câu hỏi lớn hơn và thay đổi từ hệ thống sang hệ thống, nhưng nói chung hầu hết các triển khai malloc()
được tối ưu hóa cho các chương trình phân bổ và deallocating theo thứ tự giống như ngăn xếp. Perl sử dụng tính toán tham chiếu để theo dõi bộ nhớ có nghĩa là deallocations có nghĩa là (không giống như ngôn ngữ dựa trên GC sử dụng malloc()
bên dưới) thực tế không phải là tất cả khó khăn để cho biết nơi deallocation sẽ xảy ra và theo thứ tự nào.
Nó có thể là bạn có thể tổ chức lại chương trình của bạn để tận dụng lợi thế của fact- này bằng cách gọi undef($old_object)
một cách rõ ràng - và theo thứ tự đúng, một cách tương tự như cách C-lập trình viên nói free(old_object);
Đối dài các chương trình đang chạy (ngày, tháng, v.v.), nơi tôi tải các chu kỳ tải/sao chép/đổ, tôi thu thập dữ liệu bằng cách sử dụng exit() and exec()
và không thể giải quyết được toàn bộ dữ liệu của tôi (sử dụng Storable
) và mô tả tệp (sử dụng $^F
) và exec($0)
- thường có biến môi trường được đặt là $ENV{EXEC_GC_MODE}
và bạn có thể cần một cái gì đó tương tự ngay cả khi bạn không có bất kỳ rò rỉ của riêng bạn chỉ đơn giản là vì Perl bị rò rỉ các khối nhỏ mà hệ thống của bạn malloc()
không thể tìm ra cách trả lại.
Tất nhiên, nếu bạn bị rò rỉ trong mã của bạn, thì phần còn lại của lời khuyên của tôi có liên quan hơn một chút. Ban đầu, nó được đăng to another question on this subject, nhưng không được rõ ràng bao gồm các chương trình chạy dài.
Mọi rò rỉ bộ nhớ chương trình perl sẽ là XS lưu giữ tham chiếu hoặc cấu trúc dữ liệu hình tròn. Devel::Cycle là một công cụ tuyệt vời để tìm tham khảo vòng tròn, nếu bạn biết cấu trúc nào có khả năng chứa các vòng lặp. Devel::Peek có thể được sử dụng để tìm các đối tượng có số lượng tham chiếu cao hơn mong đợi.
Nếu bạn không biết nơi nào khác để xem, Devel::LeakTrace::Fast có thể là một địa điểm tốt đầu tiên, nhưng bạn sẽ cần một perl được xây dựng để gỡ lỗi.
Nếu bạn nghi ngờ bị rò rỉ bên trong XS-không gian, nó khó khăn hơn nhiều, và Valgrind có lẽ sẽ là đặt cược tốt nhất của bạn. Test::Valgrind có thể giúp bạn giảm số lượng mã bạn cần tìm kiếm, nhưng điều này sẽ không hoạt động trên Windows, vì vậy bạn phải chuyển (ít nhất là phần bị rò rỉ) sang Linux để thực hiện việc này.
http://search.cpan.org/perldoc?Scalar::Util 'weaken' –
Làm thế nào để 'weaken' giúp bạn? – geocar
@geocar, điều này thật tuyệt vời! Phương pháp mạnh mẽ duy nhất cho vấn đề không thể tránh khỏi của rò rỉ bộ nhớ trong các chương trình perl phức tạp mà tôi biết. –