2012-09-27 25 views
5

Mam do czynienia z dziwnym problemem obsługi pamięci w Perlu. Pracuję w aplikacji perl, która używa dość dużych struktur mieszających. Przydzielam obiektom ref i in. Ale na końcu wydaje się, że nawet jeśli zwolniam obiekt i hash, użycie pamięci pozostaje takie samo.Zarządzanie pamięcią w perlu

Oto przykład problemu:

my $hash = {}; 
............. 
this ds gets populated with a lot of data ... 
....... 
{ 
     my $obj = new Class("data"=>$hash); 
....... 
....... 
...... 

} 

#even undefing the $hash 
undef $hash; 

# I can expect some improvement in Memory Utilization, but its not happening 

myślę, robię kilka bardzo podstawowych błędów. Czy ktoś może zasugerować?

Odpowiedz

3

Ogólnie rzecz biorąc, zarządzanie pamięcią Perl robi to, co trzeba zrobić, i nie musisz się martwić. Na przykład, jaka jest szkodliwość trzymania ogromnej ilości pamięci przeznaczonej na resztę programu? Prawdopodobnie żaden. Perl będzie zwolnić, jeśli system operacyjny jest zagrożony wyczerpaniem pamięci.

Załóżmy, że masz jakiś specjalny przypadek, taki jak skrypt, który działa stale w tle, ale czasami musi wykonać zadanie intensywnie wykorzystujące pamięć. Można to rozwiązać, dzieląc go na dwa skrypty: background.pl i memory-intensive-task.pl. Background.pl uruchamiałby w razie potrzeby stronę memory-intensive-task.pl. Pamięć zostanie zwolniona po ukończeniu i zakończeniu tego programu.

12

Nie można naprawdę przywrócić pamięci do systemu operacyjnego. Perl zwykle zachowuje ją w celu późniejszej alokacji, ale czasami będzie zbierać śmieci.

Zobacz http://learn.perl.org/faq/perlfaq3.html#How-can-I-free-an-array-or-hash-so-my-program-shrinks-

i

http://clokwork.net/2012/02/12/memory-management-in-perl/

+0

Co dzieje się w przypadku obiektów? Gdy obiekt wykracza poza zakres, destruktor zostaje wywołany. Czy to nadal będzie zawierało pamięć zmiennych leksykalnych zdefiniowanych w obiekcie? – Kallol

+0

@Kallol, ten przypadek nie różni się od normalnej zmiennej wychodzącej poza zakres, z wyjątkiem tego, że możesz wykonać niestandardowe czyszczenie swojego obiektu. Pamięć * będzie * wolna, aby Perl mógł używać czegoś innego, ale Perl nadal nie odda jej z powrotem do systemu. – dan1111

+0

jaki rodzaj czyszczenia custome można zrobić? – Kallol