jQuery lub javascript, aby znaleźć wykorzystanie pamięci strony

Czy jest sposób, aby dowiedzieć się, ile pamięci jest używane przez stronę internetową, lub przez moją aplikację jquery?

Oto moja sytuacja:

Buduję ciężką webapp z danymi za pomocą nakładki jQuery i backendu restful, który serwuje dane w JSON. Strona jest ładowana raz, a potem wszystko dzieje się za pośrednictwem ajax.

Interfejs użytkownika zapewnia użytkownikom sposób na tworzenie wielu kart w interfejsie użytkownika, a każda karta może zawierać wiele, wiele danych. Rozważam ograniczenie liczby zakładek mogą tworzyć, ale myślałem, że byłoby miło, aby ograniczyć je tylko wtedy, gdy zużycie pamięci przekroczy pewien próg.

Na podstawie odpowiedzi, chciałbym zrobić kilka wyjaśnień:

  • szukam rozwiązania uruchomieniowego (nie tylko narzędzi programistycznych), aby moja aplikacja mogła określać działania na podstawie zużycia pamięci w przeglądarce użytkownika.
  • liczenie elementów DOM lub rozmiaru dokumentu może być dobrym oszacowaniem, ale może być dość niedokładne, ponieważ nie obejmują powiązanie zdarzeń, data (), wtyczki i inne struktury danych w pamięci.
Author: David Mulder, 2010-03-27

10 answers

2015 Update

W 2012 roku nie było to możliwe, jeśli chcesz obsługiwać wszystkie główne przeglądarki w użyciu. Niestety, w tej chwili nadal jest to funkcja tylko dla Chrome (niestandardowe rozszerzenie window.performance).

window.performance.memory

Obsługa przeglądarki: Chrome 6+


2012 ODPOWIEDŹ

Czy istnieje sposób, aby dowiedzieć się, ile pamięci jest używane przez stronę internetową, lub przez moją aplikację jquery? Szukam rozwiązania runtime (nie tylko narzędzia programistyczne), dzięki czemu moja aplikacja może określać działania na podstawie zużycia pamięci w przeglądarce użytkownika.

Prosta, ale poprawna odpowiedź to Nie . Nie wszystkie przeglądarki udostępniają takie dane. I myślę, że powinieneś porzucić ten pomysł po prostu dlatego, że złożoność i niedokładność rozwiązania "handmade" może wprowadzić więcej problemów niż rozwiązuje.

Liczenie elementów DOM lub rozmiaru dokumentu może być dobrym oszacowaniem, ale może być dość niedokładne ponieważ nie zawiera wiązania zdarzeń, data (), wtyczek i innych struktur danych w pamięci.

Jeśli naprawdę chcesz trzymać się swojego pomysłu, powinieneś oddzielić stałą i dynamiczną treść.

Stała zawartość nie zależy od działań użytkownika (pamięć używana przez pliki skryptów, wtyczki itp.)
Wszystko inne jest uważane za dynamiczne i powinno być głównym celem przy określaniu limitu.

Ale nie ma łatwego sposobu, aby je podsumować. Możesz zaimplementować system śledzenia , który gromadzi wszystkie te informacje. Wszystkie operacje powinny wywoływać odpowiednie metody śledzenia. e. G:

Metoda zawijania lub nadpisywania jQuery.data w celu poinformowania systemu śledzenia o alokacji danych.

Owijaj manipulacje html tak, aby dodawanie lub usuwanie treści było śledzone ({[3] } jest najlepszym oszacowaniem).

Jeśli przechowujesz duże obiekty w pamięci, powinny one być również monitorowane.

W przypadku wiązania zdarzeń należy użyć zdarzenia delegacja , a następnie można ją również uznać za nieco stały czynnik.

Innym aspektem, który utrudnia prawidłowe oszacowanie zapotrzebowania na pamięć, jest to, że różne przeglądarki mogą przydzielać pamięć w różny sposób (dla obiektów Javascript i elementów DOM).

 56
Author: galambalazs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-22 15:48:17

Możesz użyć Navigation Timing API .

Navigation Timing jest JavaScript API do dokładnego pomiaru wydajności w Internecie. Interfejs API zapewnia prosty sposób na uzyskanie dokładnych i szczegółowych statystyk czasu-natywnie-dla nawigacji po stronie i zdarzeń ładowania.

window.performance.memory daje dostęp do danych wykorzystania pamięci JavaScript.


Zalecana lektura

 39
Author: Sindre Sorhus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-22 19:26:41

To pytanie ma 5 lat, a zarówno javascript, jak i przeglądarki ewoluowały niesamowicie w tym czasie. Ponieważ jest to teraz możliwe (przynajmniej w niektórych przeglądarkach), a to pytanie jest pierwszym wynikiem, gdy Google "javascript show memory useage", pomyślałem, że zaproponuję nowoczesne rozwiązanie.

Pamięć-statystyki.js: https://github.com/paulirish/memory-stats.js/tree/master

Ten skrypt (który możesz uruchomić w dowolnym momencie na dowolnej stronie) wyświetli bieżące użycie pamięci strona:

var script=document.createElement('script');
script.src='https://rawgit.com/paulirish/memory-stats.js/master/bookmarklet.js';
document.head.appendChild(script);
 14
Author: Dustin Brownell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-01 22:23:25

Nie wiem, w jaki sposób można dowiedzieć się, ile pamięci jest używane przez przeglądarkę, ale może być w stanie użyć heurystyki na podstawie liczby elementów na stronie. Uinsg jQuery, możesz zrobić $('*').length i to da ci liczbę elementów DOM. Szczerze mówiąc, prawdopodobnie łatwiej jest po prostu przetestować użyteczność i wymyślić stałą liczbę kart do obsługi.

 8
Author: tvanfosson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-27 17:36:17

Użyj narzędzia Chrome Heap Snapshot tool

Istnieje również narzędzie Firebug o nazwie MemoryBug , ale wygląda na to, że nie jest jeszcze zbyt dojrzałe.

 4
Author: Pablo Fernandez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-27 18:00:53

Jeśli chcesz po prostu zobaczyć do testów, istnieje sposób w Chrome poprzez stronę dewelopera, aby śledzić użycie pamięci, ale nie wiesz, jak to zrobić bezpośrednio w javascript.

 3
Author: Zachary K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-27 17:37:04

Chciałbym zaproponować zupełnie inne rozwiązanie od innych odpowiedzi, a mianowicie obserwować szybkość aplikacji i gdy spadnie poniżej zdefiniowanych poziomów albo pokazać wskazówki dla użytkownika, aby zamknąć karty, lub wyłączyć nowe karty od otwierania. Prostą klasą dostarczającą tego rodzaju informacji jest na przykład https://github.com/mrdoob/stats.js . Poza tym, to może nie być mądre dla tak intensywnej aplikacji, aby zachować wszystkie karty w pamięci w pierwszej kolejności. Np. prowadzenie bezpieczniejszą opcją może być tylko stan użytkownika (przewijanie) i wczytywanie wszystkich danych za każdym razem, gdy otwierają się wszystkie ostatnie dwie karty.

Wreszcie, Programiści webkit dyskutowali nad dodawaniem informacji o pamięci do javascript, ale zdobyli wiele argumentów na temat tego, co i co nie powinno być ujawniane. Tak czy inaczej, nie jest mało prawdopodobne, że tego rodzaju informacje będą dostępne w ciągu kilku lat (chociaż informacje te nie są zbyt przydatne w tej chwili).

 3
Author: David Mulder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-26 10:18:35

Idealne pytanie, kiedy zacznę od podobnego projektu!

Nie ma dokładnego sposobu monitorowania użycia pamięci JS w aplikacji, ponieważ wymagałoby to wyższych uprawnień. Jak wspomniano w komentarzach, sprawdzanie liczby wszystkich elementów itp. byłoby stratą czasu, ponieważ ignoruje związane wydarzenia itp.

To byłby problem z architekturą, gdyby wycieki pamięci były widoczne lub nieużywane elementy były utrzymywane. Upewnienie się, że zawartość zamkniętych kart zostanie całkowicie usunięta bez przeciągania obsługa zdarzeń itp. byłoby idealnie; zakładając, że tak się stało, możesz po prostu symulować intensywne użytkowanie w przeglądarce i ekstrapolować wyniki monitorowania pamięci (wpisz about:memory w pasku adresu)

Protip: jeśli otworzysz tę samą stronę w IE, FF, Safari... i Chrome; a następnie przejdź do about: memory w Chrome, będzie raportować użycie pamięci w wszystkich innych przeglądarkach. Super!

 1
Author: o.v.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-23 00:51:07

Możesz chcieć, aby serwer śledził ich przepustowość dla tej sesji (ile bajtów danych zostało do nich wysłanych). Gdy przekroczą limit, zamiast wysyłać dane za pośrednictwem ajax, serwer powinien wysłać kod błędu, którego javascript użyje, aby powiedzieć użytkownikowi, że użył zbyt dużo danych.

 0
Author: Cam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-27 17:38:51

Możesz dostać dokument.documentElement.innerHTML i sprawdź jego długość. To da ci liczbę bajtów używanych przez Twoją stronę internetową.

To może nie działać we wszystkich przeglądarkach. Możesz więc zamknąć wszystkie elementy swojego ciała w gigantycznym div I wywołać innerhtml na tym div. Coś jak <body><div id="giantDiv">...</div></body>

 0
Author: Midhat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-27 17:39:24