You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/5-functions-closures/6-memory-management/article.md
+13-13Lines changed: 13 additions & 13 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -17,7 +17,7 @@
17
17
</ul>
18
18
19
19
Эти значения гарантированно хранятся в памяти. Мы будем называть их *корнями*.
20
-
</li>
20
+
</li>
21
21
<li>**Любое другое значение сохраняется в памяти лишь до тех пор, пока доступно из корня по ссылке или цепочке ссылок.**</li>
22
22
</ol>
23
23
@@ -31,7 +31,7 @@
31
31
32
32
### Достижимость и наличие ссылок
33
33
34
-
Есть одно упрощение для работы с памятью: "значение остаётся в памяти, пока на него есть ссылка".
34
+
Есть одно упрощение для работы с памятью: "значение остаётся в памяти, пока на него есть хотя бы одна ссылка".
35
35
36
36
Но такое упрощение будет верным лишь в одну сторону.
37
37
@@ -47,7 +47,7 @@ var user = {
47
47
user =null;
48
48
```
49
49
50
-
Теперь объект `{ name: "Вася" }` более недоступен. Память будет освобождена.
50
+
Теперь объект `{ name: "Вася" }` более недоступен. Память будет освобождена.
51
51
</li>
52
52
<li>**Неверно -- в другую сторону: наличие ссылки не гарантирует, что значение останется в памяти.**
53
53
@@ -62,9 +62,9 @@ petya.friend = vasya;
62
62
vasya = petya =null;
63
63
```
64
64
65
-
Несмотря на то, что на объекты `vasya`, `petya` ссылаются друг на друга через ссылку `friend`, то есть можно сказать, что на каждый из них есть ссылка, последняя строка делает эти объекты в совокупности недостижимыми.
65
+
Несмотря на то, что на объекты `vasya`, `petya` ссылаются друг на друга через ссылку `friend`, то есть можно сказать, что на каждый из них есть ссылка, последняя строка делает эти объекты в совокупности недостижимыми.
66
66
67
-
Поэтому они будут удалены из памяти.
67
+
Поэтому они будут удалены из памяти.
68
68
69
69
Здесь как раз и играет роль "достижимость" -- оба этих объекта становятся недостижимы из корней, в первую очередь, из глобальной области, стека.
70
70
@@ -138,7 +138,7 @@ window.family = null;
138
138
Как видим, объекты в конструкции всё ещё связаны между собой. Однако, поиск от корня их не находит, они не достижимы, и значит сборщик мусора удалит их из памяти.
139
139
140
140
[smart header="Оптимизации"]
141
-
Проблема описанного алгоритма -- в больших задержках. Если объектов много, то на поиск всех достижимых уйдёт довольно много времени. А ведь выполнение скрипта при этом должно быть остановлено, уже просканированные объекты не должны поменяться до окончания процесса. Получатся небольшие, но неприятные паузы-зависания в работе скрипта.
141
+
Проблема описанного алгоритма -- в больших задержках. Если объектов много, то на поиск всех достижимых уйдёт довольно много времени. А ведь выполнение скрипта при этом должно быть остановлено, уже просканированные объекты не должны поменяться до окончания процесса. Получатся небольшие, но неприятные паузы-зависания в работе скрипта.
142
142
143
143
Поэтому современные интерпретаторы применяют различные оптимизации.
144
144
@@ -157,7 +157,7 @@ function showTime() {
157
157
158
158
## Замыкания
159
159
160
-
Объекты переменных, о которых шла речь ранее, в главе про замыкания, также подвержены сборке мусора. Они следуют тем же правилам, что и обычные объекты.
160
+
Объекты переменных, о которых шла речь ранее, в главе про замыкания, также подвержены сборке мусора. Они следуют тем же правилам, что и обычные объекты.
161
161
162
162
Объект переменных внешней функции существует в памяти до тех пор, пока существует хоть одна внутренняя функция, ссылающаяся на него через свойство `[[Scope]]`.
163
163
@@ -206,7 +206,7 @@ function f() {
206
206
returnfunction() {};
207
207
}
208
208
209
-
// 3 функции, каждая ссылается на свой объект переменных,
209
+
// 3 функции, каждая ссылается на свой объект переменных,
210
210
// каждый со своим значением value
211
211
var arr = [f(), f(), f()];
212
212
```
@@ -224,15 +224,15 @@ function f() {
224
224
}
225
225
226
226
var g =f(); // функция g жива
227
-
// а значит в памяти остается соответствующий объект переменных f()
227
+
// а значит в памяти остается соответствующий объект переменных f()
228
228
229
229
g =null; // ..а вот теперь память будет очищена
230
230
```
231
231
232
232
</li>
233
233
</ul>
234
234
235
-
### Оптимизация в V8 и её последствия
235
+
### Оптимизация в V8 и её последствия
236
236
237
237
Современные JS-движки делают оптимизации замыканий по памяти. Они анализируют использование переменных и в случае, когда переменная из замыкания абсолютно точно не используется, удаляют её.
238
238
@@ -286,7 +286,7 @@ g();
286
286
Это не глюк отладчика, а особенность работы V8, которая, возможно, будет когда-нибудь изменена. Вы всегда сможете проверить, не изменилось ли чего, запустив примеры на этой странице.
287
287
[/warn]
288
288
289
-
## Влияние управления памятью на скорость
289
+
## Влияние управления памятью на скорость
290
290
291
291
На создание новых объектов и их удаление тратится время. Это важно иметь в виду в случае, когда важна производительность.
alert( "Разница в "+ (timeRecursion / timeLoop) +" раз" );
320
320
```
321
321
322
-
Различие в скорости на таком примере может составлять, в зависимости от интерпретатора, 2-10 раз.
322
+
Различие в скорости на таком примере может составлять, в зависимости от интерпретатора, 2-10 раз.
323
323
324
324
Вообще, этот пример -- не показателен. Ещё раз обращаю ваше внимание на то, что такие искусственные "микротесты" часто врут. Правильно их делать -- отдельная наука, которая выходит за рамки этой главы. Но и на практике ускорение в 2-10 раз оптимизацией по количеству объектов (и вообще, любых значений) -- отнюдь не миф, а вполне достижимо.
325
325
326
-
В реальной жизни в большинстве ситуаций такая оптимизация несущественна, просто потому что "JavaScript и так достаточно быстр". Но она может быть эффективной для "узких мест" кода.
326
+
В реальной жизни в большинстве ситуаций такая оптимизация несущественна, просто потому что "JavaScript и так достаточно быстр". Но она может быть эффективной для "узких мест" кода.
0 commit comments