Nói đúng ra, bạn thực sự không biết. Các tài liệu chính thức là hơi thận trọng khi thảo luận về cách sử dụng bộ nhớ. Nếu và khi bộ nhớ được giải phóng là đến nội bộ perl. Bất kỳ câu trả lời cho câu hỏi của bạn được dựa trên kiến thức (hoặc đầu cơ về) các nội bộ, có thể thay đổi. Điều đó nói rằng, có một vài điều chúng tôi có thể biết:
- Bộ nhớ được sử dụng bởi perl sẽ được hệ điều hành thu hồi khi thực hiện kết thúc.
- Bộ nhớ được cấp cho một biến không thể giải phóng được nếu có bất kỳ tham chiếu nào đến nó.
Ngoài ra không có bảo đảm, mặc dù perlguts cung cấp một số cái nhìn sâu sắc vào các hành vi của các internals:
Perl sử dụng một cơ chế thu gom rác thải count-driven tham khảo. SV, AVs hoặc HVs (viết tắt là xV sau đây) bắt đầu cuộc đời của họ với số lượng tham chiếu là của 1.Nếu số lượng tham chiếu của xV giảm xuống 0, thì nó sẽ bị hủy và bộ nhớ của nó được tạo sẵn để sử dụng lại.
Điều này thường không xảy ra ở cấp độ Perl trừ khi biến là không xác định hoặc biến cuối cùng giữ tham chiếu đến nó bị thay đổi hoặc bị ghi đè.
Bộ nhớ "được cung cấp để sử dụng lại" không hoàn toàn giống như được giải phóng. Nó cho phép perl sử dụng bộ nhớ cho một thứ khác nhưng không trả lại cho hệ điều hành. Bạn không nên mong đợi perl trả lại bộ nhớ cho hệ điều hành trước khi thoát.
Từ góc độ của một nhà phát triển, lời khuyên của tôi về quản lý sử dụng bộ nhớ là:
- Không tải nhiều dữ liệu hơn vào bộ nhớ cùng một lúc hơn là cần thiết. (ví dụ: đọc tệp theo từng dòng thay vì slurping nếu có thể)
- Tuyên bố biến giới hạn cho phạm vi hợp lý nhỏ nhất.
- Không giữ tham chiếu đến dữ liệu khi không còn cần thiết nữa. (Hoặc để cho nó đi ra khỏi phạm vi hoặc rõ ràng tham chiếu.)
- Xác định các biến lớn khi chúng không còn cần thiết nữa. (ví dụ: qua số
undef %hash
)
Làm những việc này không nhất thiết dẫn đến bộ nhớ được giải phóng/sử dụng lại, nhưng tối đa hóa cơ hội.
Nguồn
2016-11-29 15:15:30
http://www.perlmonks.org/?node_id=266845 –
Khi mã perl kết thúc và thoát, thời gian đó chỉ có tất cả bộ nhớ của biến được deallocated. Sự hiểu biết của tôi là chính xác hay không? Tôi chỉ cần làm rõ. –
Có, hệ điều hành thu hồi bộ nhớ khi thoát perl (và biến lexical ngay lập tức được khai hoang để quản lý bộ nhớ perl khi từ vựng nằm ngoài phạm vi). –