Будет ли веб-сайт, работающий только на Ajax, потреблять память со временем?

#javascript #jquery #ajax

#javascript #jquery #ajax

Вопрос:

Я создаю веб-сайт, работающий только на ajax, чтобы я мог использовать необычные переходы страниц и другие приятные вещи. Для всех элементов у меня есть фрагмент JavaScript / jQuery, подобный этому:

 var slider = {
   init: function(){
      if($(".slider").length > 0){
         //do slider stuff
      }
   }
}
  

И при каждой загрузке страницы я все инициализирую, и когда этот элемент находится на этой текущей странице, он будет делать это.

 pageloaded = function(){
   slider.init();
   tabs.init();
   comments.init();
   reviews.init();
   //...
}
  

Но мой вопрос. Когда старая страница удаляется, и к ее кнопкам и другим элементам были прикреплены все виды javascript. Будет ли автоматически «освобождаться» память и другие ресурсы, которые он потребляет, когда эта страница .removed() ?

Есть ли какие-либо другие недостатки этого способа программирования?

Ответ №1:

Это больше связано с производительностью, чем с памятью.

Это зависит от того, что вы делаете и как вы это делаете.

Если вы заменяете полную загрузку страницы AJAX-запросами (т. Е. Выполняете AJAX-вызовы только тогда, когда пользователь нажимает на кнопку ссылки и будет иметь полную загрузку страницы), тогда AJAX уменьшит нагрузку на сервер, потому что вы (предположительно) выполняете меньше обработки и возвращаете меньше данных.

если вы добавляете автоматическое обновление типа AJAX и опрашиваете сервер каждые несколько секунд, это может увеличить нагрузку в зависимости от использования.

Вы можете получить хорошие результаты, предполагая, что вы выполняете хорошую реализацию.

РЕДАКТИРОВАТЬ (для вашего второго комментария):

Почему я говорю, что у вас хорошие результаты, если вы полагаетесь на хорошую реализацию.

Обычно браузер сохраняет недоступную внутреннюю ссылку на XHR (также называемую корнем сборки мусора).

Это позволяет поддерживать не только XHR в рабочем состоянии на время выполнения запроса, но и закрытие, на которое оно ссылается.

После того, как приходит ответ, он также поддерживает данные ответа. Браузер будет решать, когда освобождать эти объекты. В то время как более старые версии IE сохраняют эти ссылки намного дольше, чем необходимо, современные bwosers обладают лучшей производительностью и возможностями.

Это действительно сложная проблема, чтобы объяснить ее в нескольких словах.

Итак, чтобы повторно ограничить:

Вы можете получить хорошие результаты, предполагая, что вы выполняете хорошую реализацию.

Комментарии:

1. Нет, я имею в виду первое, что вы описываете. Выполняйте действия только тогда, когда пользователь нажимает на ссылку. Однако я имею в виду не серверную часть производительности, а интерфейс производительности в браузере. Будут ли все привязки javascript очищены браузером при их удалении?

2. Ты грустный: Will the memory and other resources it consumes вот почему я дал тебе такой ответ. Я внес правку, чтобы ответить на ваш второй комментарий. Надеюсь, это поможет. Вы можете прочитать в Интернете об этой проблеме. 🙂

Ответ №2:

Теоретически ответ заключается в том, что этого не произойдет, если все сделано правильно. 🙂

Когда я говорю «сделано правильно», я имею в виду в 2 местах, во-первых, иногда в самом браузере есть ошибки, которые могут вызвать утечки памяти. В какой-то момент Microsoft использовала сборщик мусора с подсчетом ссылок, и это был классический пример того, что поставщик браузера допустил ошибку. Я думаю, что все браузеры теперь используют сборщик мусора mark и sweep.

Другое место, где вы можете получить утечки памяти, очевидно, в javascript, либо вами, либо сторонней библиотекой.

То, что Javascript использует сборщик мусора, еще не означает, что вы не можете получить утечки памяти, как могут предположить некоторые люди. Это все еще возможно, наиболее распространенная ошибка для javascript — скажем, делегирование событий и setInterval, но вы могли бы так же легко создать некоторые данные для глобального объекта window и т. Д.

Главное, что следует учитывать, это то, что если на мои объекты больше нет ссылок, тогда да, вся память для указанных объектов будет автоматически освобождена сборщиком мусора.

В Chrome есть несколько симпатичных инструментов отладки спуска для изучения подобных вещей. Итак, если вы обеспокоены утечкой памяти, посмотрите там.