🫠 Π£Ρ‚Π΅Ρ‡ΠΊΠΈ памяти Π² JavaScript: ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ ΠΈ способы устранСния

Π£Ρ‚Π΅Ρ‡ΠΊΠ° памяти – ΠΎΠ΄ΠΈΠ½ ΠΈΠ· самых ΠΊΠΎΠ²Π°Ρ€Π½Ρ‹Ρ… Π±Π°Π³ΠΎΠ², способный ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ простоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Π½Π΅ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π»ΠΈΠ²ΠΎΠ³ΠΎ монстра. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ основныС ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ памяти Π² JavaScript ΠΈ научимся ΠΈΡ… эффСктивно ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ.

ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈΠ³Ρ€Π°Π΅Ρ‚ ΠΊΠ»ΡŽΡ‡Π΅Π²ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ Π² ΡƒΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. Π”Π°ΠΆΠ΅ нСбольшоС Π·Π°ΠΌΠ΅Π΄Π»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΠΏΠΎΡ‚Π΅Ρ€Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΈ сниТСнию конвСрсии. Одной ΠΈΠ· частых ΠΏΡ€ΠΈΡ‡ΠΈΠ½ Π΄Π΅Π³Ρ€Π°Π΄Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ памяти – ситуации, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ освобоТдаСт ΠΏΠ°ΠΌΡΡ‚ΡŒ, которая Π΅ΠΉ большС Π½Π΅ Π½ΡƒΠΆΠ½Π°. Π”Π°Π²Π°ΠΉΡ‚Π΅ разбСрСмся, ΠΏΠΎΡ‡Π΅ΠΌΡƒ это происходит ΠΈ ΠΊΠ°ΠΊ с этим Π±ΠΎΡ€ΠΎΡ‚ΡŒΡΡ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΡƒΡ‚Π΅Ρ‡ΠΊΠ° памяти Π² JavaScript

Когда Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΊΠΎΠ΄ Π½Π° JavaScript, ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ выдСляСт ΠΏΠ°ΠΌΡΡ‚ΡŒ для хранСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ…. Но Ссли эта ΠΏΠ°ΠΌΡΡ‚ΡŒ Π½Π΅ освобоТдаСтся воврСмя (ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ), Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ явлСниС, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ ΡƒΡ‚Π΅Ρ‡ΠΊΠΎΠΉ памяти.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ· ΠΆΠΈΠ·Π½ΠΈ: ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ρƒ вас Π΅ΡΡ‚ΡŒ ящик для хранСния Π²Π΅Ρ‰Π΅ΠΉ. Если Π²Ρ‹ постоянно ΠΊΠ»Π°Π΄Π΅Ρ‚Π΅ Π² Π½Π΅Π³ΠΎ Π½ΠΎΠ²Ρ‹Π΅ Π²Π΅Ρ‰ΠΈ, Π½Π΅ убирая старыС ΠΈ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Π΅, Ρ€Π°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ ящик пСрСполнится. Π£Ρ‚Π΅Ρ‡ΠΊΠ° памяти – это Ρ‚ΠΎΡ‚ ΠΆΠ΅ самый ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΉ «ящик», Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.

Π§Ρ‚ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΡƒΡ‚Π΅Ρ‡ΠΊΡƒ памяти Π² JavaScript

Π’ JavaScript ΡƒΡ‚Π΅Ρ‡ΠΊΠ° памяти происходит, ΠΊΠΎΠ³Π΄Π° ΠΏΠ°ΠΌΡΡ‚ΡŒ, которая большС Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Π½Π΅ освобоТдаСтся, ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Π΅Π΅ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ:

  • ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡ‚ΡŒ всС большС памяти.
  • Π Π°Π±ΠΎΡ‚Π° прилоТСния ΠΎΡ‰ΡƒΡ‚ΠΈΠΌΠΎ замСдляСтся.
  • Π’ ΠΊΡ€Π°ΠΉΠ½ΠΈΡ… случаях ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²ΠΈΡΠ½ΡƒΡ‚ΡŒ ΠΈΠ»ΠΈ Π²Ρ‹Π»Π΅Ρ‚Π΅Ρ‚ΡŒ ΠΈΠ·-Π·Π° Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ памяти.
πŸ‘¨β€πŸ’»πŸŽ¨ Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Π΅Ρ€Π°
Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Π΅Ρ€Π°Β»

Как JavaScript управляСт ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сборщика мусора

Как JavaScript управляСт ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сборщика мусора

Π’ JavaScript ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ происходит с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ сборщик мусора. По Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ с ΡƒΠΆΠ΅ упомянутым ящиком для хранСния это ΡƒΠ±ΠΎΡ€Ρ‰ΠΈΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ рСгулярно провСряСт ваш ящик (ΠΏΠ°ΠΌΡΡ‚ΡŒ) ΠΈ Π²Ρ‹ΠΊΠΈΠ΄Ρ‹Π²Π°Π΅Ρ‚ всС Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Π΅ Π²Π΅Ρ‰ΠΈ (Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹).

Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ сборщик мусора:

  • Находит Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Если Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° большС Π½Π΅Ρ‚ ссылок (ΠΎΠ½ Π½ΠΈΠ³Π΄Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ), JavaScript опрСдСляСт Π΅Π³ΠΎ ΠΊΠ°ΠΊ «мусор».
  • ΠžΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅Ρ‚ Π·Π°Π½ΡΡ‚ΡƒΡŽ мусором ΠΏΠ°ΠΌΡΡ‚ΡŒ, автоматичСски удаляя Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ сборщик мусора допускаСт ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ

Иногда ΡƒΠ±ΠΎΡ€Ρ‰ΠΈΠΊ Π½Π΅ справляСтся со своСй Π·Π°Π΄Π°Ρ‡Π΅ΠΉ. НапримСр:

  • ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ связаны Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ (Ρ‡Π΅Ρ€Π΅Π· замыкания ΠΈΠ»ΠΈ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅), Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ΠΈ большС Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹.
  • Π£Π±ΠΎΡ€Ρ‰ΠΈΠΊ Π²ΠΈΠ΄ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ связи ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ, ΠΈ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎ считаСт ΠΈΡ… Π½ΡƒΠΆΠ½Ρ‹ΠΌΠΈ.

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‚Π°ΠΊΠΎΠΉ мусор остаСтся Π² памяти, ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΡƒΡ‚Π΅Ρ‡ΠΊΠ°.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ памяти Π² JavaScript ΠΈ ΠΊΠ°ΠΊ ΠΈΡ… ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ

Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Π² памяти Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ всСго Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния. Если случайно ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π² глобальной области видимости, ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π΄Π°ΠΆΠ΅ Ссли ΡƒΠΆΠ΅ Π½Π΅ Π½ΡƒΠΆΠ½Π°. Π—Π΄Π΅ΡΡŒ пСрСмСнная leakyVar создаСтся Π² глобальной области ΠΈΠ·-Π·Π° отсутствия ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова let ΠΈΠ»ΠΈ const:

// ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ памяти
function createGlobalVariable() {
    leakyVar = "Π― глобальная пСрСмСнная!"; // пСрСмСнная объявлСна Π±Π΅Π· 'let' ΠΈΠ»ΠΈ 'const'
createGlobalVariable();

РСшСниС: всСгда ΠΎΠ±ΡŠΡΠ²Π»ΡΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ let ΠΈΠ»ΠΈ const, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΈΡ… ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости.

function createGlobalVariable() {
    let safeVar = "Π― локальная пСрСмСнная!"; // Π›ΠΎΠΊΠ°Π»ΡŒΠ½Π°Ρ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости
}
createGlobalVariable();
Π£Ρ‚Π΅Ρ‡ΠΊΠΈ памяти ΠΌΠ΅ΡˆΠ°ΡŽΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ Π΄ΠΎΠ»Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с вашим Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ – ΠΈΠ·-Π·Π° Π½ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‚Π΅Ρ€ΡΡ‚ΡŒ Π°ΡƒΠ΄ΠΈΡ‚ΠΎΡ€ΠΈΡŽ. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ этого ΠΈΠ·Π΄Π΅ΠΆΠ°Ρ‚ΡŒ.

НСзакрытыС ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΠΈ событий

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: eсли Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΡŒ события (event listener), ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Если элСмСнт ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΈΠ· DOM, Π½ΠΎ Π½Π΅ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΡŒ, ΠΏΠ°ΠΌΡΡ‚ΡŒ останСтся занятой:

// ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ памяти
const button = document.getElementById("myButton");

button.addEventListener("click", () => {
    console.log("Кнопка Π½Π°ΠΆΠ°Ρ‚Π°!");
});

// Если ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΈΠ· DOM, Π½ΠΎ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΡŒ,
// ΠΏΠ°ΠΌΡΡ‚ΡŒ для button останСтся занятой.
document.body.removeChild(button);

РСшСниС: ΠΏΠ΅Ρ€Π΅Π΄ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ΠΌ элСмСнта ΠΈΠ· DOM Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΠΈ событий.

// БохраняСм ссылку Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ
function handleClick() {
    console.log("Кнопка Π½Π°ΠΆΠ°Ρ‚Π°!");
}

button.addEventListener("click", handleClick);

// ΠŸΠ΅Ρ€Π΅Π΄ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΠΈ β€” снимаСм ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΡŒ
button.removeEventListener("click", handleClick);
document.body.removeChild(button);

Бсылки Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Π΅ DOM-элСмСнты

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: Ссли Π² ΠΊΠΎΠ΄Π΅ остаСтся ссылка Π½Π° DOM-элСмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΆΠ΅ ΡƒΠ΄Π°Π»Π΅Π½ со страницы, ΠΏΠ°ΠΌΡΡ‚ΡŒ, занимаСмая этим элСмСнтом, Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ освобоТдСна. Π—Π΄Π΅ΡΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π½Π΅ освободится, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ пСрСмСнная cachedDiv всС Π΅Ρ‰Π΅ содСрТит ссылку Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ элСмСнт:

// ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ памяти
let cachedDiv = document.getElementById("myDiv");

// УдаляСм элСмСнт ΠΈΠ· DOM
document.body.removeChild(cachedDiv);

// Но пСрСмСнная cachedDiv всС Π΅Ρ‰Π΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ ссылку Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ элСмСнт

РСшСниС: послС удалСния DOM-элСмСнта ΠΈΠ· памяти Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Π½ΡƒΠ»ΠΈΡ‚ΡŒ ссылки Π½Π° Π½Π΅Π³ΠΎ.

// ОсвобоТдаСм ΠΏΠ°ΠΌΡΡ‚ΡŒ, обнуляя ссылку
cachedDiv = null;

Замыкания

Π—Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° внутрСнняя функция Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠ· внСшнСй области видимости, Π΄Π°ΠΆΠ΅ Ссли внСшняя функция ΡƒΠΆΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ. Замыкания β€” ΠΌΠΎΡ‰Π½Ρ‹ΠΉ инструмСнт, Π½ΠΎ ΠΈΡ… Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ использованиС ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΡƒΡ‚Π΅Ρ‡ΠΊΠ°ΠΌ памяти.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: Ссли Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ ссылку Π½Π° большиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ»ΠΈ массивы, Ρ‚ΠΎ эти Π΄Π°Π½Π½Ρ‹Π΅ останутся Π² памяти, Π΄Π°ΠΆΠ΅ Ссли ΡƒΠΆΠ΅ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

  • ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ largeArray создаСтся Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ createClosure().
  • ВлоТСнная функция Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ largeArray Ρ‡Π΅Ρ€Π΅Π· Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅.
  • Когда функция createClosure() Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ, большой массив остаСтся Π² памяти, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π° Π½Π΅Π³ΠΎ ссылаСтся пСрСмСнная leakyClosure.
function createClosure() {
    const largeArray = new Array(1000000); // Π‘ΠΎΠ»ΡŒΡˆΠΎΠΉ массив
    return function() {
        console.log(largeArray.length);
    };
}

const leakyClosure = createClosure();

РСшСниС:

  • Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Ρ… Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ. Если большой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ Π½ΡƒΠΆΠ΅Π½ Π² Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΈ, Π½Π΅ оставляйтС Π΅Π³ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ.
  • НС создавайтС замыкания Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ†ΠΈΠΊΠ»ΠΎΠ² Π±Π΅Π· нСобходимости.
  • Π Π°Π·Ρ€Ρ‹Π²Π°ΠΉΡ‚Π΅ ссылки Π½Π° большиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Ссли ΠΎΠ½ΠΈ большС Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹.
function createSafeClosure() {
    let largeArray = new Array(1000000);
    
    // ΠžΡ‡ΠΈΡ‰Π°Π΅ΠΌ ΠΏΠ°ΠΌΡΡ‚ΡŒ послС использования
    largeArray = null; 
    
    return function() {
        console.log("Π—Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ создано Π±Π΅Π· ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ памяти!");
    };
}

const safeClosure = createSafeClosure();
Знакомимся с Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ ΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π±Π»ΠΎΠΊΠΎΠΌ любого прилоТСния Π½Π° JavaScript β€” Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ.

Как ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ памяти

Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹ оснащСны инструмСнтами для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ Π²Ρ‹ΡΠ²Π»ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ. НапримСр:

  • Π’ Chrome ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Β«Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°Β» (Π½Π°ΠΆΠΌΠΈΡ‚Π΅ F12) ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π²ΠΎ Π²ΠΊΠ»Π°Π΄ΠΊΡƒ Β«ΠŸΠ°ΠΌΡΡ‚ΡŒΒ».
  • Π—Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ снимок памяти ΠΈ Π½Π°ΠΉΠ΄ΠΈΡ‚Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Π² памяти дольшС, Ρ‡Π΅ΠΌ Π΄ΠΎΠ»ΠΆΠ½Ρ‹.
  • Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ нСсколько снимков памяти, сдСланных с ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΠΎΠΌ. Если ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ снимками, это ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ.
  • ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°ΠΉΡ‚Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ памяти вашим ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Если Π³Ρ€Π°Ρ„ΠΈΠΊ использования памяти постоянно растСт ΠΈ Π½Π΅ сниТаСтся послС выполнСния Π·Π°Π΄Π°Ρ‡, это ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡƒΡŽ ΡƒΡ‚Π΅Ρ‡ΠΊΡƒ памяти.

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΡƒΡ‚Π΅Ρ‡ΠΊΡƒ памяти, Π½ΡƒΠΆΠ½ΠΎ:

  • Π˜Π·Π±Π΅Π³Π°Ρ‚ΡŒ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠΉΡ‚Π΅ let ΠΈ const, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ….
  • ΠžΡ‡ΠΈΡ‰Π°Ρ‚ΡŒ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΠΈ событий. ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с DOM ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ удаляйтС ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΠΈ событий, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ большС Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹.
  • Π Π°Π·Ρ€Ρ‹Π²Π°Ρ‚ΡŒ ссылки Π½Π° большиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. УстанавливайтС Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² null, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ.
  • Аккуратно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ замыкания. Они ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ссылки Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΡƒΡ‚Π΅Ρ‡ΠΊΠ°ΠΌ, особСнно Π² Ρ†ΠΈΠΊΠ»Π°Ρ…, Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°Ρ… ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π°Ρ….
  • РСгулярно ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ использованиС памяти. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π½Ρ‹Π΅ инструмСнты Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΈΠ»ΠΈ спСциализированныС инструмСнты.
***

ΠŸΡ€ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ использовалась публикация Β«Memory Leaks in JavaScript: A Simple GuideΒ».

***

ВСсСнний Π°ΠΏΠ³Ρ€Π΅ΠΉΠ΄ Π½Π°Π²Ρ‹ΠΊΠΎΠ²: -35% Π½Π° курсы ΠΏΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΎΡ‚ Proglib Academy

  1. ΠžΡΠ½ΠΎΠ²Ρ‹ IT для нСпрограммистов – для Ρ€Π΅ΠΊΡ€ΡƒΡ‚Π΅Ρ€ΠΎΠ², ΠΌΠ°Ρ€ΠΊΠ΅Ρ‚ΠΎΠ»ΠΎΠ³ΠΎΠ², ΠΏΡ€ΠΎΠ΄ΠΆΠ΅ΠΊΡ‚- ΠΈ ΠΏΡ€ΠΎΠ΄Π°ΠΊΡ‚-ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ²
  2. Frontend Basic – стСк Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ для старта Π² Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ (HTML, CSS, React, Git, JavaScript)
  3. ΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ° для Data Science – ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΊ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ Π·Π°Π΄Π°Ρ‡ уровня FAANG-ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΉ
  4. Алгоритмы ΠΈ структуры Π΄Π°Π½Π½Ρ‹Ρ… – Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ΅ ΠΏΠΎΠ³Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ для ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ ΠΊ тСхничСским собСсСдованиям
  5. Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ ML – Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² машинноС ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ с фокусом Π½Π° tree-based ΠΌΠΎΠ΄Π΅Π»ΠΈ
  6. АрхитСктуры ΠΈ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ проСктирования – освоитС основныС ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹ проСктирования ΠΈ ΠΏΡ€ΠΎΠΊΠ°Ρ‡Π°Π΅Ρ‚Π΅ свои Π½Π°Π²Ρ‹ΠΊΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΠΎΡ€Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•