2012-12-10 19 views
10

My node.js projekt cierpi wyciek pamięci, już ustawić zmienne null w zamknięciu, to znaczy, wiem kodu:zidentyfikować wyciek pamięci zamknięcia z memwatch-węzła

var a = 0; 
var b = 1; 
var c = 0; 
example_func(c, func(){ 
    console.log(b); 
}); 

spowoduje wycieki pamięci, więc dodałem kod, który ustawił te zmienne na wartość null;

var a = 0; 
var b = 1; 
var c = 0; 
example_func(c, func(){ 
    console.log(b); 
    a = null; 
    b = null; 
    c = null; 
}); 

Ale nadal mam przecieków, więc próbuję użyć memwatch-node aby dowiedzieć się, co się dzieje z mojego kodu.

A wynik pokazuje, że closure powoduje wyciek, ale nie jest wystarczająco określony, aby celować.

Mam JSON jak ten

{ what: 'Closure', 
    '+': 12521, 
    size: '520.52 kb', 
    '-': 5118, 
    size_bytes: 533016 }, 

I zastanawiam się, czy mogę uzyskać więcej szczegółowych informacji, o których zamknięcie jest nieszczelne.

Przypisałem nazwę dla wszystkich zamknięć, ale nadal nie działa.

+0

To literalny obiekt. Sam w sobie nie ma nic wspólnego z "zamknięciem", poza tym, że jedna z jego właściwości jest ustawiona na łańcuch "Zamknięcie", który równie dobrze mógłby brzmieć "1982 Datsun Cherry". –

+0

Więc jaki rodzaj obiektu by to zrobił? Sam nie ustalam "zamknięcia". – bxshi

+0

Tak, jestem zawstydzony, mogę lepiej zobaczyć, o co teraz pytasz. Byłem w dokumentacji memwatch, ale nie mogę znaleźć dowodu sekcji 'what: 'Closure'' w raporcie diff. [This] (https://hacks.mozilla.org/2012/11/tracking-down-memory-leaks-in-node-js-a-node-js-holiday-season/) wskazuje, że zgłoszono wycieki zamknięcia, ale nie w ten sposób. To trochę zagmatwane. –

Odpowiedz

2

Nie można uzyskać dokładniejszych informacji o tym zamknięciu. memwatch pobiera zrzut sterty v8, a następnie pobiera różnice i zgłasza wycieki, jeśli po 5 kolejnych zdarzeniach zbierania śmieci liczba obiektów tego typu nadal rośnie.

Sądzę, że jesteś zdezorientowany tym, jakie są zamknięcia. The MDN page on closures daje dobry opis. Zamknięcie nie jest zmienną, ale zakresem, który umożliwia funkcjom zachowanie referencji i kontynuowanie pracy, gdy są używane w części kodu, w której te zmienne odniesienia nie byłyby w przeciwnym razie dostępne.

Jeśli przekazujesz funkcje dookoła, zachowaj odwołanie do tej funkcji, jej zamknięcie może odwoływać się do innych zamknięć. Możliwe, że masz jedno zamknięcie, które może mieć w sobie wiele.

Wykonaj następujące czynności: wyłącz części kodu, dopóki memwatch nie przestanie narzekać. Następnie spójrz na ten kod. Jeśli nadal jesteś zdezorientowany, opublikuj więcej szczegółów w tym pytaniu.