Skip to content

Commit 724cac5

Browse files
committed
Merge pull request iliakan#198 from bogem/clearer
Make statement clearer
2 parents fa5eff9 + 0cb304a commit 724cac5

1 file changed

Lines changed: 13 additions & 13 deletions

File tree

  • 1-js/5-functions-closures/6-memory-management

1-js/5-functions-closures/6-memory-management/article.md

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
</ul>
1818

1919
Эти значения гарантированно хранятся в памяти. Мы будем называть их *корнями*.
20-
</li>
20+
</li>
2121
<li>**Любое другое значение сохраняется в памяти лишь до тех пор, пока доступно из корня по ссылке или цепочке ссылок.**</li>
2222
</ol>
2323

@@ -31,7 +31,7 @@
3131

3232
### Достижимость и наличие ссылок
3333

34-
Есть одно упрощение для работы с памятью: "значение остаётся в памяти, пока на него есть ссылка".
34+
Есть одно упрощение для работы с памятью: "значение остаётся в памяти, пока на него есть хотя бы одна ссылка".
3535

3636
Но такое упрощение будет верным лишь в одну сторону.
3737

@@ -47,7 +47,7 @@ var user = {
4747
user = null;
4848
```
4949

50-
Теперь объект `{ name: "Вася" }` более недоступен. Память будет освобождена.
50+
Теперь объект `{ name: "Вася" }` более недоступен. Память будет освобождена.
5151
</li>
5252
<li>**Неверно -- в другую сторону: наличие ссылки не гарантирует, что значение останется в памяти.**
5353

@@ -62,9 +62,9 @@ petya.friend = vasya;
6262
vasya = petya = null;
6363
```
6464

65-
Несмотря на то, что на объекты `vasya`, `petya` ссылаются друг на друга через ссылку `friend`, то есть можно сказать, что на каждый из них есть ссылка, последняя строка делает эти объекты в совокупности недостижимыми.
65+
Несмотря на то, что на объекты `vasya`, `petya` ссылаются друг на друга через ссылку `friend`, то есть можно сказать, что на каждый из них есть ссылка, последняя строка делает эти объекты в совокупности недостижимыми.
6666

67-
Поэтому они будут удалены из памяти.
67+
Поэтому они будут удалены из памяти.
6868

6969
Здесь как раз и играет роль "достижимость" -- оба этих объекта становятся недостижимы из корней, в первую очередь, из глобальной области, стека.
7070

@@ -138,7 +138,7 @@ window.family = null;
138138
Как видим, объекты в конструкции всё ещё связаны между собой. Однако, поиск от корня их не находит, они не достижимы, и значит сборщик мусора удалит их из памяти.
139139

140140
[smart header="Оптимизации"]
141-
Проблема описанного алгоритма -- в больших задержках. Если объектов много, то на поиск всех достижимых уйдёт довольно много времени. А ведь выполнение скрипта при этом должно быть остановлено, уже просканированные объекты не должны поменяться до окончания процесса. Получатся небольшие, но неприятные паузы-зависания в работе скрипта.
141+
Проблема описанного алгоритма -- в больших задержках. Если объектов много, то на поиск всех достижимых уйдёт довольно много времени. А ведь выполнение скрипта при этом должно быть остановлено, уже просканированные объекты не должны поменяться до окончания процесса. Получатся небольшие, но неприятные паузы-зависания в работе скрипта.
142142

143143
Поэтому современные интерпретаторы применяют различные оптимизации.
144144

@@ -157,7 +157,7 @@ function showTime() {
157157

158158
## Замыкания
159159

160-
Объекты переменных, о которых шла речь ранее, в главе про замыкания, также подвержены сборке мусора. Они следуют тем же правилам, что и обычные объекты.
160+
Объекты переменных, о которых шла речь ранее, в главе про замыкания, также подвержены сборке мусора. Они следуют тем же правилам, что и обычные объекты.
161161

162162
Объект переменных внешней функции существует в памяти до тех пор, пока существует хоть одна внутренняя функция, ссылающаяся на него через свойство `[[Scope]]`.
163163

@@ -206,7 +206,7 @@ function f() {
206206
return function() {};
207207
}
208208

209-
// 3 функции, каждая ссылается на свой объект переменных,
209+
// 3 функции, каждая ссылается на свой объект переменных,
210210
// каждый со своим значением value
211211
var arr = [f(), f(), f()];
212212
```
@@ -224,15 +224,15 @@ function f() {
224224
}
225225

226226
var g = f(); // функция g жива
227-
// а значит в памяти остается соответствующий объект переменных f()
227+
// а значит в памяти остается соответствующий объект переменных f()
228228

229229
g = null; // ..а вот теперь память будет очищена
230230
```
231231

232232
</li>
233233
</ul>
234234

235-
### Оптимизация в V8 и её последствия
235+
### Оптимизация в V8 и её последствия
236236

237237
Современные JS-движки делают оптимизации замыканий по памяти. Они анализируют использование переменных и в случае, когда переменная из замыкания абсолютно точно не используется, удаляют её.
238238

@@ -286,7 +286,7 @@ g();
286286
Это не глюк отладчика, а особенность работы V8, которая, возможно, будет когда-нибудь изменена. Вы всегда сможете проверить, не изменилось ли чего, запустив примеры на этой странице.
287287
[/warn]
288288

289-
## Влияние управления памятью на скорость
289+
## Влияние управления памятью на скорость
290290

291291
На создание новых объектов и их удаление тратится время. Это важно иметь в виду в случае, когда важна производительность.
292292

@@ -319,8 +319,8 @@ timeRecursion = performance.now() - timeRecursion;
319319
alert( "Разница в " + (timeRecursion / timeLoop) + " раз" );
320320
```
321321

322-
Различие в скорости на таком примере может составлять, в зависимости от интерпретатора, 2-10 раз.
322+
Различие в скорости на таком примере может составлять, в зависимости от интерпретатора, 2-10 раз.
323323

324324
Вообще, этот пример -- не показателен. Ещё раз обращаю ваше внимание на то, что такие искусственные "микротесты" часто врут. Правильно их делать -- отдельная наука, которая выходит за рамки этой главы. Но и на практике ускорение в 2-10 раз оптимизацией по количеству объектов (и вообще, любых значений) -- отнюдь не миф, а вполне достижимо.
325325

326-
В реальной жизни в большинстве ситуаций такая оптимизация несущественна, просто потому что "JavaScript и так достаточно быстр". Но она может быть эффективной для "узких мест" кода.
326+
В реальной жизни в большинстве ситуаций такая оптимизация несущественна, просто потому что "JavaScript и так достаточно быстр". Но она может быть эффективной для "узких мест" кода.

0 commit comments

Comments
 (0)