Table of Contents
Zaktualizowano
Niedawno niektórzy z powodu naszych użytkowników napotkali błąd ekspresowy wyciek dysku twardego. Ten problem może wystąpić z wielu powodów. Przeanalizujemy je teraz.
Utrzymuję ciężką aplikację internetową Express.js, która może się zawieszać z powodu problemów z pamięcią:
BŁĄD KRYTYCZNY: część CALL_AND_RETRY_LAST nie powiodła się - sterta JavaScriptpamięć
Kiedy uruchamiam dostawcę, zużycie pamięci wynosi zwykle około 170 MB (raportowane w czasie htop jako pamięć RES). Potem otwieram zapytania i pamięć zaczyna rosnąć.Pobiegłem memwatch
, aby spróbować wyśledzić okoliczności, które niestety wyglądają jak wyciek pamięci, ale udokumentowałem memwatch.HeapDiff()
:
{ coś przed skokiem do: nodes: Size_bytes: 2093729, 197165296, size: '188.03 mb', w: nodes: Size_bytes: 2491264, 232097040, size: '221.34MB', ...
… gdzie widzę, że program wykorzystuje 221,34 MB na te sterty; Jednak htop
używa 2 GB dysku twardego, gdy zawiedzie.
Może pojawić się pytanie: w moich założeniach są poprawne, do czego może służyć przypomnienie bez stosu, które mówi, że htop zgłosił je jako pamięć RES?
Skoro mój mąż, ja i @dougwilson przetestowaliśmy to, sprowadzimy to do tego:
// budowa =============================================== = =========// Pobierz wszystkie najbardziej potrzebne symbole specjalneNarzędzialet ejs = require('ejs');var oznacza http wymagaj('http');var ścieżka równa wymagane('ścieżka');var server oznacza http.createServer(function(req, res)var nazwa pliku jest równa path.join(__dirname, 'index.min.ejs');ejs.renderFile(nazwa pliku, run(błąd, ciąg)res.end(str);););// start ============================================== = ================server.listen(81)funkcja generateHeapDumpAndStats() //1.Wymuś przechwytywanie bs za każdym razem, gdy taka funkcja jest zdecydowanie wywoływana Próbować globalny.gc(); Złapać console.log("Musisz uruchomić program za pomocą --expose-gc'"); 'węzeł proces.exit(); //2. Drukuj statystyki stosu var heapUsed równa się process.memoryUsage().heapUsed; konsola. log('Program używa bajtów wi + heapUsed + i sterty.');setInterval(generuj HeapDumpAndStats, 3000);
Plamy z pamięci nadal stanowią problem, z którym każdy programista musi sobie poradzić prędzej czy później. Są o wiele bardziej powszechne w językach, być może tam, gdzie język rutynowo obsługuje pamięć większości ludzi. Plamy w pamięci mogą prowadzić do problemów, takich jak powolne programy, awarie, duże opóźnienia i nie tylko.
W tym poście na blogu przyjrzyjmy się, jakie wycieki pamięci są ostatnimi ogólnymi i jak ich uniknąć. Bądź w dobrej aplikacji NodeJS. Chociaż jest to znacznie bardziej skoncentrowane na NodeJS, ogólnie powinno również zajmować się JavaScript i TypeScript. Unikanie pamięci pozwala aplikacji rodzinnej na efektywne wykorzystanie zasobów, a także poprawia wydajność.
Jeśli chodzi o wycieki pamięci w Node.js, całkiem możliwe, że możesz zajrzeć do Monitora formularzy aplikacji AppSignal dla Node.js. Od wersji 1.2.0 jest dostarczany z rzeczywistym paskiem narzędzi pokazującym rozmiar kontekstów najwyższego wolumenu, a zwłaszcza aktualnie aktywnych kontekstów najwyższego zakresu. Żadne narzędzia nie są wymagane.
Zarządzanie pamięcią JavaScript
W celu zrozumienia wycieków wody w pamięci, musimy najpierw zrozumieć, w jaki sposób pamięć jest bez wątpienia zarządzana w NodeJS. Oznacza to zrozumienie, w jaki sposób pamięć jest obsługiwana przez silnik JavaScript używany przez NodeJS. NodeJS zwykle używa silnika V8 dla JavaScript. Powinieneś przeczytać dokument Wizualizacja zarządzania pamięcią w silniku V8, aby lepiej zrozumieć, jak działa przestrzeń pamięci i jak JavaScript jest używany w V8.
- Stos: Oto statyczny plik zawierający architekturę metody/funkcji, wartości pierwotne i obiekty pamięci dla bezpieczeństwa. Ta przestrzeń pamięci jest oczywiście zarządzana przez system (OS).
- Heap: To tutaj V8 przechowuje rzeczywiste obiekty fizyczne lub dane zmienne. Jest to blok oferujący największy obszar pamięci, w którym występuje szafa na śmieci (GC).
Zaktualizowano
Czy masz dość powolnego działania komputera? Denerwują Cię frustrujące komunikaty o błędach? ASR Pro to rozwiązanie dla Ciebie! Nasze zalecane narzędzie szybko zdiagnozuje i naprawi problemy z systemem Windows, jednocześnie znacznie zwiększając wydajność systemu. Więc nie czekaj dłużej, pobierz ASR Pro już dziś!
V8 obsługuje niejawne wyrzucanie śmieci na każdym z naszych stosów. Mówiąc najprościej, zwalnia to pamięć używaną przez osierocone obiekty, którymi są mój mąż i ja, tj. obiekty H, do których nie ma już bezpośredniego odniesienia na stosie, również (poprzez pośrednie odniesienie do innego obiektu), które mają związek z tworzenie nowego ciała.
Odśmiecacz pamięci V8 jest odpowiedzialny za wiele osób odzyskujących nieużywaną pamięć RAM, aby Process v8 najprawdopodobniej wykorzystał ją ponownie. Odśmiecacze v8 są pokoleniowe (elementy w stercie są pogrupowane według wieku jako usunięte na różnych etapach). Rally V8 wykorzystuje 1 okresy i trzy różne algorytmy, aby przynosić pieniądze.
Czym są wycieki pamięci?
Ujmując to po prostu, wyciek pamięci to nic, ponadto jeśli utracony blok pamięci na tych stertach nie był używany przez aplikację, a ponadto nie został zwrócony przez śmieci kolektor przy rozważaniu rozdzielczości.system operacyjny. Więc to właściwie bezużyteczna droga stworzona przez pamięć. Nagromadzenie takich przestojów może spowodować, że aplikacja nie będzie miała wystarczającej ilości pamięci do uruchomienia, a system operacyjny nie wykorzysta wystarczającej ilości pamięci do jej przydzielenia, powodując spowolnienia i/lub zwykle stos aplikacji, a nawet śledzenie systemu operacyjnego.
Co powoduje wyciek pamięci w JS
Programy do automatycznych operacji na pamięci, takie jak garbage collector w V8, mają na celu zapobieganie takim wyciekom. Na przykład okrągłe odwołania do pamięci nie stanowią już problemu, niemniej jednak mogą nadal występować z powodu niechcianych jednostek danych na stercie i działać z różnych powodów. Poniżej przedstawiono niektóre z wielu typowych przyczyn.
- Zmienne globalne. Ponieważ globalne odwołania do zmiennych w JavaScript są oparte na węźle głównym (oknie, lub alternatywnie raczej
it
), nigdy nie są węzłami głównymi połączonymi z pozostaniem przez całe życie oprogramowania komputerowego jako śmieci. jest przywracany w pamięci raz na czas, w którym aplikacja ma działać. Dotyczy to każdego obiektu odwołującego się do kryteriów globalnych, jak również wszystkich elementów potomnych dotyczących osoby. Wykres uprawnień dla obiektów, do których nawiązuje się od korzenia, powinien prowadzić do bezpiecznego wycieku cyfrowego. - Wiele odniesień: posiadanie odniesień do tego samego celu z różnych obiektów może prowadzić do wycieku pamięci, jeśli jedno z odwołań jest obecnie pozostaje otwartym przeciekiem. .
- Zamknięcia. Zamknięcia umieszczone w JavaScript mają niesamowitą zdolność zapamiętywania typowo otaczającego kontekstu. Jeśli zamknięcie zawiera przejście do prawidłowego dużego obiektu na stosach, zachowuje swój obiekt w pamięci przez określony czas, o ile dane zamknięcie jest używane. Oznacza to, że możesz łatwo znaleźć się w sytuacji, w której zamknięcie zawierające takie każde odniesienie może zostać niewłaściwie użyte, co spowoduje marnowanie miejsca na dysku Przyspiesz swój komputer już dziś dzięki temu prostemu pobieraniu.
How To Fix An Express Memory Leak?
Hur Fixar Man En Express-minnesläcka?
Как исправить утечку памяти Express?
Hoe Een Express-geheugenlek Op Te Lossen?
Como Corrigir Um Vazamento De Memória Express?
Comment Réparer Une Fuite De Mémoire Express ?
¿Cómo Reparar Una Pérdida De Memoria Express?
Wie Behebe Ich Ein Express-Speicherleck?
Express 메모리 누수를 해결하는 방법은 무엇입니까?
Come Riparare Una Perdita Di Memoria Express?