To może być istotne, że Perl nigdy nie przywraca pamięci do systemu: Wszystko zależy od malloc()
i wszystkich zasad z tym związanych.
Wiedząc, jak malloc()
alokuje pamięć jest ważne, aby odpowiedzieć na pytanie większe, a to zależy od systemu, ale generalnie większość malloc()
implementacje są zoptymalizowane dla programów przydzielania i dealokując zamówień Stack podobne. Perl używa licznika odwołań do śledzenia pamięci, co oznacza, że deallokacje oznaczają (w przeciwieństwie do języka opartego na GC, który używa malloc()
pod), w rzeczywistości nie jest to wcale trudne, aby dokonać deallokacji iw jakiej kolejności.
może być tak, że można zreorganizować swój program, aby skorzystać z tej fact- wywołując undef($old_object)
wyraźnie - i we właściwej kolejności, w sposób podobny do sposobu C-programiści mówią free(old_object);
Dla długo- uruchomione programy (dni, miesiące, itp.), gdzie mam mnóstwo cykli ładowania/kopiowania/zrzucania, zbieram śmieci używając exit() and exec()
, a gdzie jest to niemożliwe na całym świecie, po prostu pakuję moje struktury danych (używając Storable
) i deskryptorów plików (przy użyciu $^F
) i exec($0)
- zazwyczaj ze zmienną środowiskową ustawioną jako $ENV{EXEC_GC_MODE}
, a może być potrzebna coś podobnego pod warunkiem, że nie ma żadnych takich samych , nawet jeśli nie masz żadnych przecieki twojego własnego po prostu dlatego, że Perl przecieka małe kawałki, że twój system malloc()
nie może dowiedzieć się, jak oddać.
Oczywiście, jeśli masz przecieki w swój kod, to reszta mojej porady jest nieco bardziej istotne. Pierwotnie został opublikowany to another question on this subject, ale nie był to jawnie obejmujący długo działające programy.
Wszystkie wycieki pamięci programu perl będą albo przenoszeniem XS na referencję, albo kołową strukturą danych. Devel::Cycle to doskonałe narzędzie do wyszukiwania odwołań cyklicznych, jeśli wiesz, jakie struktury mogą zawierać pętle. Devel::Peek można użyć do znalezienia obiektów o wyższej od oczekiwanej liczbie odwołań.
Jeśli nie wiesz, gdzie jeszcze szukać, Devel::LeakTrace::Fast może być dobrym pierwszym miejscem, ale będziesz potrzebować perla stworzonego do debugowania.
Jeśli podejrzewasz, że wyciek znajduje się w przestrzeni XS, jest to znacznie trudniejsze, a prawdopodobnie najlepszym rozwiązaniem będzie Valgrind. Test::Valgrind może pomóc ci zmniejszyć ilość kodu, który musisz przeszukać, ale to nie zadziała w Windowsie, więc będziesz musiał przenieść (przynajmniej nieszczelną część) do Linuksa, aby to zrobić.
http://search.cpan.org/perldoc?Scalar::Util 'osłabienie' –
Jak pomaga ci "osłabić"? – geocar
@geocar, to jest genialne! Jedyną niezawodną metodą nieuniknionego problemu wycieków pamięci w złożonych programach perlowych, które znam. –