2016-11-29 13 views
6

Tôi đọc về biến từ vựng từ một trang web, trong đó họ giải thích, Biến được khai báo bằng từ khoá "của tôi" là biến từ vựng. Nó tồn tại từ nơi nó được khai báo bằng cách sử dụng từ khóa của tôi cho đến cuối khối hiện tại. Đây là phạm vi của biến từ vựng.Khi nào perl giải phóng biến từ vựng của nó khỏi bộ nhớ?

Nghi ngờ của tôi là, nếu phạm vi kết thúc, biến từ vựng không có trong bộ nhớ hay không? Nếu biến lexical không phải là miễn phí từ bộ nhớ sau khi hoàn thành phạm vi có nghĩa là, khi nó sẽ miễn phí từ bộ nhớ? Bất cứ ai có thể giải thích cho tôi rõ ràng?

+0

http://www.perlmonks.org/?node_id=266845 –

+0

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õ. –

+1

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). –

Trả lời

0

Biến từ vựng sẽ được "giải phóng" khi nó nằm ngoài phạm vi. Nếu nó trỏ đến một cấu trúc dữ liệu với các tham chiếu vòng tròn, cấu trúc này sẽ không được "giải phóng" ngay cả khi không có ai khác trỏ đến nó.

+3

Nó có thể là giá trị chỉ ra 'Scalar :: Util' và [' weaken'] (http://perldoc.perl.org/Scalar/Util.html#weaken) tại thời điểm này. – Sobrique

6

Biến từ vựng Perl thích giữ bộ nhớ của chúng để nó chỉ có thể được sử dụng lại vào lần tiếp theo từ vựng nằm trong phạm vi. Thông thường, đối với các số, tham chiếu, các chuỗi nhỏ hoặc các mảng hoặc mảng có vài phần tử, điều này không đáng kể.

Đối với từ vựng giữ chuỗi lớn hoặc mảng hoặc băm với nhiều thành phần, bạn có thể sử dụng rõ ràng undef yourvarname để giải phóng bộ nhớ của chúng. (Mặc dù điều này chỉ giải phóng bộ nhớ được sử dụng cho những thứ khác bởi quá trình Perl, không giải phóng nó cho các quá trình khác.)

2

Có một số nhầm lẫn ở đây. Trong Perl, có bộ nhớ cho biến trong bảng biểu tượng và bộ nhớ cho dữ liệu được lưu trữ trong biến. Nhưng trong mọi trường hợp, bộ nhớ Perl "giải phóng" để nó có thể tái sử dụng nó sau này.

Bộ nhớ cho biến không được gộp cho đến khi chương trình con trả về. Đây là trường hợp các vòng lặp, trong đó cùng một bộ nhớ sẽ được tái sử dụng cho biến đó.

Bộ nhớ cho dữ liệu không được gộp cho đến khi số lượng tham chiếu của nó bằng 0. Điều này rất hữu ích khi bạn muốn trả về dữ liệu cho chương trình con gọi. Nếu bộ nhớ được giải phóng khi chương trình con quay trở lại, dữ liệu sẽ bị mất.

Quy tắc chung là: Trừ khi bạn tạo tham chiếu vòng tròn, Perl sẽ chăm sóc thu gom rác cho bạn.

Quy tắc thứ hai của ngón tay cái: Không tạo tham chiếu vòng tròn.

4

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.

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