μλ¬Έ: JavaScript Memory Management: How to Avoid Common Memory Leaks and Improve Performance
μ ν리μΌμ΄μ μ μ΅μ ννλ λ° λμμ΄ λλ JSμ λ©λͺ¨λ¦¬ κ΄λ¦¬μ λν΄ μ€λͺ ν©λλ€.
μΉ κ°λ°μλ μμ±νλ λͺ¨λ μ½λκ° μ ν리μΌμ΄μ μ μ±λ₯μ μν₯μ λ―ΈμΉ μ μλ€λ κ²μ μκ³ μμ΅λλ€. μλ°μ€ν¬λ¦½νΈμμ μ§μ€ν΄μΌ ν κ°μ₯ μ€μν μμ μ€ νλλ λ©λͺ¨λ¦¬ κ΄λ¦¬μ λλ€.
μ¬μ©μκ° μΉμ¬μ΄νΈμ μνΈμμ©ν λλ§λ€ μλ‘μ΄ κ°μ²΄, λ³μ, ν¨μκ° μμ±λλ€κ³ μκ°ν΄λ³΄μΈμ. μ£Όμνμ§ μμΌλ©΄ μ΄λ¬ν κ°μ²΄κ° μμ¬ λΈλΌμ°μ μ λ©λͺ¨λ¦¬λ₯Ό λ§κ³ μ 체 μ¬μ©μ κ²½νμ λλ¦¬κ² λ§λ€ μ μμ΅λλ€. μ΄λ λ§μΉ μ 보 κ³ μλλ‘μ κ΅ν΅ 체μ¦κ³Ό κ°μμ μ¬μ©μλ₯Ό μ΄ννκ² λ§λλ λ΅λ΅ν λ³λͺ© νμμ λλ€.
μ΄λ¬ν νμμ κΌ κ²ͺμ νμλ μμ΅λλ€. μ¬λ°λ₯Έ μ§μκ³Ό κΈ°μ μ νμ©νλ©΄ μλ°μ€ν¬λ¦½νΈ λ©λͺ¨λ¦¬λ₯Ό μ μ΄νκ³ , μ ν리μΌμ΄μ μ΄ μννκ³ ν¨μ¨μ μΌλ‘ μ€νλλλ‘ ν μ μμ΅λλ€. μ΄ κΈμμλ λ©λͺ¨λ¦¬ λμμ μΌλ°μ μΈ μμΈκ³Ό μ΄λ₯Ό λ°©μ§νκΈ° μν μ λ΅μ ν¬ν¨ν΄ μλ°μ€ν¬λ¦½νΈ λ©λͺ¨λ¦¬ κ΄λ¦¬μ μ λ°μ μΈ λ΄μ©μ μ΄ν΄λ΄ λλ€. μ λ¬Έκ°λ μ΄λ³΄ κ°λ°μλ κΉλνκ³ κ°κ²°νλ©° λΉ λ₯Έ μ½λλ₯Ό μμ±νλ λ°©λ²μ λ κΉμ΄ μ΄ν΄νκ² λ κ²μ λλ€.
μλ°μ€ν¬λ¦½νΈ μμ§μ κ°λΉμ§ 컬λ ν°λ₯Ό μ¬μ©νμ¬ λ μ΄μ μ¬μ©νμ§ μλ λ©λͺ¨λ¦¬λ₯Ό ν보ν©λλ€. κ°λΉμ§ 컬λ ν°μ μν μ μ ν리μΌμ΄μ μμ λ μ΄μ μ¬μ©νμ§ μλ κ°μ²΄λ₯Ό μλ³νκ³ μ κ±°νλ κ²μ λλ€. κ°λΉμ§ 컬λ ν°λ μ½λμ κ°μ²΄μ λ³μλ₯Ό μ§μμ μΌλ‘ λͺ¨λν°λ§νκ³ μ΄λ€ κ°μ²΄κ° μ¬μ ν μ°Έμ‘°λκ³ μλμ§ μΆμ νμ¬ μ΄λ₯Ό μνν©λλ€. κ°λΉμ§ 컬λ ν°λ μ¬μ©λμ§ μλ κ°μ²΄λ₯Ό μμ ν λμμΌλ‘ νμνκ³ κ°μ²΄κ° μ¬μ© μ€μ΄λ λ©λͺ¨λ¦¬λ₯Ό ν보ν©λλ€.
κ°λΉμ§ 컬λ ν°λ βνμ(mark) λ° μ 리(sweep)βλΌλ κΈ°μ μ μ¬μ©νμ¬ λ©λͺ¨λ¦¬λ₯Ό κ΄λ¦¬ν©λλ€. μμ§ μ¬μ© μ€μΈ λͺ¨λ κ°μ²΄λ₯Ό νμν λ€μ, νμ βμ 리βνμ¬ μ¬μ©μ€μΌλ‘ νμλμ§ μμ κ°μ²΄λ₯Ό λͺ¨λ μ κ±°ν©λλ€. μ΄ νλ‘μΈμ€λ μ£ΌκΈ°μ μΌλ‘ μνλλ©° νμ λ©λͺ¨λ¦¬κ° λΆμ‘±ν λλ μνλμ΄ μ ν리μΌμ΄μ μ λ©λͺ¨λ¦¬ μ¬μ©λμ΄ νμ μ΅λν ν¨μ¨μ μΌλ‘ μ μ§λλλ‘ ν©λλ€.
μλ°μ€ν¬λ¦½νΈμμ λ©λͺ¨λ¦¬λ μ€νκ³Ό νμ΄λΌλ λ κ°μ§ μ£Όμ μμκ° μμ΅λλ€.
μ€νμ ν¨μλ₯Ό μ€ννλ λμμλ§ νμν λ°μ΄ν°λ₯Ό μ μ₯νλ λ° μ¬μ©λ©λλ€. λΉ λ₯΄κ³ ν¨μ¨μ μ΄μ§λ§ μ©λμ΄ μ νλμ΄ μμ΅λλ€. ν¨μκ° νΈμΆλλ©΄ μλ°μ€ν¬λ¦½νΈ μμ§μ ν¨μμ λ³μμ 맀κ°λ³μλ₯Ό μ€νμΌλ‘ λ°μ΄λ£κ³ , ν¨μκ° λ°νλλ©΄ λ€μ μ€νμμ κΊΌλ λλ€. μ€νμ λΉ λ₯Έ μ‘μΈμ€μ λΉ λ₯Έ λ©λͺ¨λ¦¬ κ΄λ¦¬λ₯Ό μν΄ μ¬μ©λ©λλ€.
λ°λ©΄ νμ μ ν리μΌμ΄μ μ μ 체 μλͺ λμ νμν λ°μ΄ν°λ₯Ό μ μ₯νλ λ° μ¬μ©λ©λλ€. μ€νλ³΄λ€ μ‘°κΈ λλ¦¬κ³ λ 체κ³μ μ΄μ§λ§ μ©λμ΄ ν¨μ¬ ν½λλ€. νμ μ¬λ¬ λ² μ‘μΈμ€ν΄μΌ νλ κ°μ²΄, λ°°μ΄ λ° κΈ°ν 볡μ‘ν λ°μ΄ν° ꡬ쑰λ₯Ό μ μ₯νλ λ° μ¬μ©λ©λλ€.
λ©λͺ¨λ¦¬ λμλ μ ν리μΌμ΄μ μ μ μ ν΄ μ±λ₯ λ¬Έμ λ₯Ό μΌμΌν€λ κ΅νν μ μ΄ λ μ μλ€λ κ²μ μ μκ³ κ³μ€ κ²μ λλ€. λ©λͺ¨λ¦¬ λμμ μΌλ°μ μΈ μμΈμ μ΄ν΄νλ©΄ λ©λͺ¨λ¦¬ λμλ₯Ό λ°©μ§νλ λ° λμμ΄ λ μ μμ΅λλ€.
λ©λͺ¨λ¦¬ λμμ κ°μ₯ μΌλ°μ μΈ μμΈ μ€ νλλ μν μ°Έμ‘°μ λλ€. μν μ°Έμ‘°λ λ κ° μ΄μμ κ°μ²΄κ° μλ‘λ₯Ό μ°Έμ‘°νμ¬ κ°λΉμ§ 컬λ ν°κ° λμ μ μλ μνμ μμ±ν λ λ°μν©λλ€. μ΄λ‘ μΈν΄ κ°μ²΄κ° λ μ΄μ νμνμ§ μκ² λμ΄λ μ€λ«λμ λ©λͺ¨λ¦¬μ μ μ§λ μ μμ΅λλ€. λ€μμ μμμ λλ€.
let object1 = {};
let object2 = {};
// κ°μ²΄1κ³Ό κ°μ²΄2 μ¬μ΄μ μν μ°Έμ‘°λ₯Ό μμ±ν©λλ€.
object1.next = object2;
object2.prev = object1;
// object1κ³Ό object2λ‘ λ¬΄μΈκ°λ₯Ό μνν©λλ€.
// ...
// μν μ°Έμ‘°λ₯Ό λμΌλ €λ©΄ object1κ³Ό object2λ₯Ό nullλ‘ μ€μ ν©λλ€.
object1 = null;
object2 = null;
μ΄ μμ μμλ object1
κ³Ό object2
λΌλ λ κ°μ κ°μ²΄λ₯Ό μμ±νκ³ next
λ° prev
νλ‘νΌν°λ₯Ό μΆκ°νμ¬ λ κ°μ²΄ μ¬μ΄μ μν μ°Έμ‘°λ₯Ό μμ±ν©λλ€. κ·Έλ° λ€μ object1
κ³Ό object2
λ₯Ό null
λ‘ μ€μ νμ¬ μν μ°Έμ‘°λ₯Ό λμ§λ§, κ°λΉμ§ 컬λ ν°κ° μν μ°Έμ‘°λ₯Ό λμ μ μκΈ° λλ¬Έμ κ°μ²΄κ° λ μ΄μ νμνμ§ μμ νμλ μ€λ«λμ λ©λͺ¨λ¦¬μ μ μ§λμ΄ λ©λͺ¨λ¦¬ λμκ° λ°μν©λλ€.
μ΄λ¬ν μ νμ λ©λͺ¨λ¦¬ λμλ₯Ό λ°©μ§νλ €λ©΄ μλ°μ€ν¬λ¦½νΈμ delete
ν€μλλ₯Ό μ¬μ©νμ¬ μν μ°Έμ‘°λ₯Ό μμ±νλ νλ‘νΌν°λ₯Ό μ κ±°νλ "μλ λ©λͺ¨λ¦¬ κ΄λ¦¬"
λΌλ κΈ°μ μ μ¬μ©ν μ μμ΅λλ€.
delete object1.next;
delete object2.prev;
μ΄λ¬ν μ νμ λ©λͺ¨λ¦¬ λμλ₯Ό λ°©μ§νλ λ λ€λ₯Έ λ°©λ²μ κ°μ²΄μ λ³μμ λν μ½ν μ°Έμ‘°λ₯Ό μμ±ν μ μλ WeakMap
κ³Ό WeakSet
μ μ¬μ©νλ κ²μ
λλ€. μ΄ μ΅μ
μ λν μμΈν λ΄μ©μ μ΄ κΈμ λ·λΆλΆμμ νμΈν μ μμ΅λλ€.
λ©λͺ¨λ¦¬ λμμ λ λ€λ₯Έ μΌλ°μ μΈ μμΈμ μ΄λ²€νΈ 리μ€λμ λλ€. μ΄λ²€νΈ 리μ€λλ₯Ό μμμ μ°κ²°νλ©΄ 리μ€λ ν¨μμ λν μ°Έμ‘°κ° μμ±λμ΄ κ°λΉμ§ 컬λ ν°κ° μμμμ μ¬μ©νλ λ©λͺ¨λ¦¬λ₯Ό ν보νμ§ λͺ»νκ² ν μ μμ΅λλ€. μμκ° λ μ΄μ νμνμ§ μμ λ 리μ€λ ν¨μλ₯Ό μ κ±°νμ§ μμΌλ©΄ λ©λͺ¨λ¦¬ λμκ° λ°μν μ μμ΅λλ€. μλ μμλ₯Ό μ°Έμ‘°νμΈμ.
let button = document.getElementById('my-button');
// λ²νΌ μμμ μ΄λ²€νΈ 리μ€λλ₯Ό λΆμ
λλ€.
button.addEventListener('click', function() {
console.log('Button was clicked!');
});
// λ²νΌμ΄ 무μΈκ° λμμ ν©λλ€.
// ...
// DOMμμ λ²νΌμ μ κ±°ν©λλ€.
button.parentNode.removeChild(button);
μ΄ μμ μμλ λ²νΌ μμμ μ΄λ²€νΈ 리μ€λλ₯Ό μ°κ²°ν λ€μ DOMμμ λ²νΌμ μ κ±°ν©λλ€. λ²νΌ μμκ° λ μ΄μ λ¬Έμμ μμ§λ§ μ΄λ²€νΈ 리μ€λλ μ¬μ ν μ°κ²°λμ΄ μμΌλ―λ‘ λ¦¬μ€λ ν¨μμ λν μ°Έμ‘°κ° μμ±λμ΄ κ°λΉμ§ 컬λ ν°κ° μμμμ μ¬μ©νλ λ©λͺ¨λ¦¬λ₯Ό ν보νμ§ λͺ»ν©λλ€. μμκ° λ μ΄μ νμνμ§ μμ λ 리μ€λ ν¨μλ₯Ό μ κ±°νμ§ μμΌλ©΄ λ©λͺ¨λ¦¬ λμκ° λ°μν μ μμ΅λλ€.
μ΄λ¬ν μ νμ λ©λͺ¨λ¦¬ λμλ₯Ό λ°©μ§νλ €λ©΄ μμκ° λ μ΄μ νμνμ§ μμ λ μ΄λ²€νΈ 리μ€λλ₯Ό μ κ±°νλ κ²μ΄ μ€μν©λλ€.
button.removeEventListener('click', function() {
console.log('Button was clicked!');
});
λ λ€λ₯Έ λ°©λ²μ νΉμ μ΄λ²€νΈ λμμ μΆκ°λ λͺ¨λ μ΄λ²€νΈ 리μ€λλ₯Ό μ κ±°νλ EventTarget.removeAllListeners()
λ©μλλ₯Ό μ¬μ©νλ κ²μ
λλ€.
button.removeAllListeners();
λ©λͺ¨λ¦¬ λμμ μΈ λ²μ§Έ μΌλ°μ μΈ μμΈμ μ μ λ³μμ λλ€. μ μ λ³μλ₯Ό μμ±νλ©΄ μ½λμ μ΄λ μμΉμμλ μ κ·Όν μ μμΌλ―λ‘ λ μ΄μ νμνμ§ μμ μμ μ νλ¨νκΈ° μ΄λ €μΈ μ μμ΅λλ€. μ΄λ‘ μΈν΄ λ³μκ° νμνμ§ μκ² λμ΄λ μ€λ«λμ λ©λͺ¨λ¦¬μ μ μ§λ μ μμ΅λλ€. μλ₯Ό λ€μ΄ λ³΄κ² μ΅λλ€.
// μ μ λ³μλ₯Ό μ μΈν©λλ€.
let myData = {
largeArray: new Array(1000000).fill('some data'),
id: 1,
};
// myData λ³μλ‘ λ¬΄μΈκ°λ₯Ό μνν©λλ€.
// ...
// μ°Έμ‘°λ₯Ό λκΈ° μν΄ myDataλ₯Ό nullλ‘ μ€μ ν©λλ€.
myData = null;
μ΄ μμ μμλ μ μ λ³μ myData
λ₯Ό μμ±νκ³ κ·Έ μμ λλμ λ°μ΄ν° λ°°μ΄μ μ μ₯ν©λλ€. κ·Έλ° λ€μ μ°Έμ‘°λ₯Ό λκΈ° μν΄ myData
λ₯Ό null
λ‘ μ€μ νμ§λ§ λ³μκ° μ μμ΄λ―λ‘ μ½λμ μ΄λ μμΉμμλ μ¬μ ν μ κ·Όν μ μμ΅λλ€. λ μ΄μ νμνμ§ μμ μμ μ νλ¨νκΈ° μ΄λ ΅κΈ° λλ¬Έμ, λ³μκ° λ μ΄μ νμνμ§ μμμλ μ€λ«λμ λ©λͺ¨λ¦¬μ μ μ§λμ΄ λ©λͺ¨λ¦¬ λμλ₯Ό μΌμΌν¬ μ μμ΅λλ€.
μ΄λ¬ν μ νμ λ©λͺ¨λ¦¬ λμλ₯Ό λ°©μ§νλ €λ©΄ "ν¨μ μ€μ½ν"
κΈ°λ²μ μ¬μ©ν μ μμ΅λλ€. μ΄ κΈ°λ²μ ν¨μλ₯Ό μμ±νκ³ ν΄λΉ ν¨μ λ΄μμ λ³μλ₯Ό μ μΈνμ¬ ν΄λΉ ν¨μμ μ€μ½ν λ΄μμλ§ μ κ·Όν μ μλλ‘ νλ κ²μ
λλ€. μ΄λ κ² νλ©΄ ν¨μκ° λ μ΄μ νμνμ§ μκ² λ λ, λ³μκ° μλμΌλ‘ κ°λΉμ§ 컬λ ν
λ©λλ€.
function myFunction() {
let myData = {
largeArray: new Array(1000000).fill('some data'),
id: 1,
};
// myData λ³μλ‘ λ¬΄μΈκ°λ₯Ό μνν©λλ€.
// ...
}
myFunction();
λ λ€λ₯Έ λ°©λ²μ var
λμ μλ°μ€ν¬λ¦½νΈμ let
κ³Ό const
λ₯Ό μ¬μ©νμ¬ λΈλ‘ μ€μ½ν λ³μλ₯Ό μμ±νλ κ²μ
λλ€. let
κ³Ό const
λ‘ μ μΈλ λ³μλ ν΄λΉ λ³μκ° μ μλ λΈλ‘ λ΄μμλ§ μ κ·Όν μ μμΌλ©° μ€μ½νλ₯Ό λ²μ΄λλ©΄ μλμΌλ‘ κ°λΉμ§ 컬λ ν
λ©λλ€.
{
let myData = {
largeArray: new Array(1000000).fill('some data'),
id: 1,
};
// myData λ³μλ‘ λ¬΄μΈκ°λ₯Ό μνν©λλ€.
// ...
}
μλ°μ€ν¬λ¦½νΈλ μ ν리μΌμ΄μ μ λ©λͺ¨λ¦¬ μ¬μ©λμ κ΄λ¦¬νλ λ° λμμ΄ λλ λ©λͺ¨λ¦¬ κ΄λ¦¬ λꡬμ κΈ°λ²μ μ 곡ν©λλ€.
μλ°μ€ν¬λ¦½νΈμμ κ°μ₯ κ°λ ₯ν λ©λͺ¨λ¦¬ κ΄λ¦¬ λꡬ μ€ νλλ WeakMap
κ³Ό WeakSet
μ
λλ€. μ΄λ€μ κ°μ²΄μ λ³μμ λν μ½ν μ°Έμ‘°λ₯Ό μμ±ν μ μλ νΉμ λ°μ΄ν° ꡬ쑰μ
λλ€. μ½ν μ°Έμ‘°λ κ°λΉμ§ 컬λ ν°κ° κ°μ²΄κ° μ¬μ©νλ λ©λͺ¨λ¦¬λ₯Ό ν보νμ§ λͺ»νλλ‘ λ§λλ€λ μ μμ μΌλ° μ°Έμ‘°μ λ€λ¦
λλ€. λ°λΌμ μν μ°Έμ‘°λ‘ μΈν λ©λͺ¨λ¦¬ λμλ₯Ό λ°©μ§νλ λ° μ μ©ν λꡬμ
λλ€. λ€μμ μμμ
λλ€.
let object1 = {};
let object2 = {};
// WeakMapμ μμ±ν©λλ€.
let weakMap = new WeakMap();
// object1μ WeakMapμ μΆκ°ν λ€μ
// object1μ WeakMapμ μΆκ°νμ¬ μν μ°Έμ‘°λ₯Ό μμ±ν©λλ€.
weakMap.set(object1, 'some data');
object1.weakMap = weakMap;
// weakSetμ μμ±νκ³ object2λ₯Ό μΆκ°ν©λλ€.
let weakSet = new WeakSet();
weakSet.add(object2);
// μ΄ κ²½μ° κ°λΉμ§ 컬λ ν°λ object1κ³Ό object2κ° μ¬μ©νλ λ©λͺ¨λ¦¬λ₯Ό ν보ν μ μμ΅λλ€.
// object1 κ³Ό object2μ μ°Έμ‘°κ° μ½νκΈ° λλ¬Έμ
λλ€.
μ΄ μμ μμλ object1
κ³Ό object2
λΌλ λ κ°μ κ°μ²΄λ₯Ό μμ±νκ³ κ°κ° WeakMap
κ³Ό WeakSet
μ μΆκ°νμ¬ μ΄λ€ μ¬μ΄μ μν μ°Έμ‘°λ₯Ό μμ±ν©λλ€. μ΄λ¬ν κ°μ²΄μ λν μ°Έμ‘°κ° μ½νκΈ° λλ¬Έμ κ°λΉμ§ 컬λ ν°λ κ°μ²΄κ° κ³μ μ°Έμ‘°λκ³ μμμλ λΆκ΅¬νκ³ κ°μ²΄κ° μ¬μ©νλ λ©λͺ¨λ¦¬λ₯Ό ν보ν μ μμ΅λλ€. μ΄λ κ² νλ©΄ μν μ°Έμ‘°λ‘ μΈν λ©λͺ¨λ¦¬ λμλ₯Ό λ°©μ§νλ λ° λμμ΄ λ μ μμ΅λλ€.
λ λ€λ₯Έ λ©λͺ¨λ¦¬ κ΄λ¦¬ κΈ°λ²μ κ°λΉμ§ 컬λ ν° APIλ₯Ό μ¬μ©νμ¬ μλμΌλ‘ κ°λΉμ§ 컬λ μ μ νΈλ¦¬κ±°νκ³ νμ νμ¬ μνμ λν μ 보λ₯Ό μ»λ κ²μ λλ€. μ΄λ λ©λͺ¨λ¦¬ λμ λ° μ±λ₯ λ¬Έμ λ₯Ό λλ²κΉ νλ λ° μ μ©ν©λλ€. λ€μμ μμμ λλ€.
let object1 = {};
let object2 = {};
// object1κ³Ό object2 μ¬μ΄μ μν μ°Έμ‘°λ₯Ό λ§λλλ€.
object1.next = object2;
object2.prev = object1;
// μλμΌλ‘ κ°λΉμ§ 컬λ ν°λ₯Ό νΈμΆν©λλ€.
gc();
μ΄ μμ μμλ object1
κ³Ό object2
λΌλ λ κ°μ κ°μ²΄λ₯Ό μμ±νκ³ next
λ° prev
νλ‘νΌν°λ₯Ό μΆκ°νμ¬ λ κ°μ²΄ μ¬μ΄μ μν μ°Έμ‘°λ₯Ό μμ±ν©λλ€. κ·Έλ° λ€μ gc()
ν¨μλ₯Ό μ¬μ©νμ¬ κ°λΉμ§ 컬λ μ
μ μλμΌλ‘ νΈλ¦¬κ±°νλ©΄ κ°μ²΄κ° κ³μ μ°Έμ‘°λκ³ μμμλ λΆκ΅¬νκ³ κ°μ²΄κ° μ¬μ©νλ λ©λͺ¨λ¦¬λ₯Ό ν보ν μ μμ΅λλ€.
gc()
ν¨μλ λͺ¨λ μλ°μ€ν¬λ¦½νΈ μμ§μμ μ§μλλ κ²μ μλλ©°, μμ§μ λ°λΌ λμμ΄ λ€λ₯Ό μ μλ€λ μ μ μ μν΄μΌ ν©λλ€. λν κ°λΉμ§ 컬λ μ
μ μλμΌλ‘ νΈλ¦¬κ±°νλ©΄ μ±λ₯μ μν₯μ λ―ΈμΉ μ μμΌλ―λ‘ νμν κ²½μ°μλ§ μ¬μ©νλ κ²μ΄ μ’μ΅λλ€.
μλ°μ€ν¬λ¦½νΈλ gc()
ν¨μ μΈμλ μλ°μ€ν¬λ¦½νΈ μμ§μ global.gc()
ν¨μμ μΌλΆ λΈλΌμ°μ μμ§μ performance.gc()
ν¨μλ₯Ό μ 곡ν©λλ€. μ΄ ν¨μλ€μ νμ νμ¬ μνλ₯Ό νμΈνκ³ κ°λΉμ§ 컬λ μ
νλ‘μΈμ€μ μ±λ₯μ μΈ‘μ νλ λ° μ¬μ©ν μ μμ΅λλ€.
ν μ€λ
μ·κ³Ό
νλ‘νμΌλ¬ μ¬μ©νκΈ°μλ°μ€ν¬λ¦½νΈλ μ ν리μΌμ΄μ μ΄ λ©λͺ¨λ¦¬λ₯Ό μ¬μ©νλ λ°©μμ μ΄ν΄νλ λ° λμμ΄ λλ ν μ€λ μ·κ³Ό νλ‘νμΌλ¬λ μ 곡ν©λλ€. ν μ€λ μ·μ μ¬μ©νλ©΄ νμ νμ¬ μνλ₯Ό μ€λ μ·μΌλ‘ μ°κ³ μ΄λ₯Ό λΆμνμ¬ μ΄λ€ κ°μ²΄κ° κ°μ₯ λ§μ λ©λͺ¨λ¦¬λ₯Ό μ¬μ©νλμ§ νμΈν μ μμ΅λλ€.
λ€μμ ν μ€λ μ·μ μ¬μ©νμ¬ μ ν리μΌμ΄μ μ λ©λͺ¨λ¦¬ λμλ₯Ό μλ³νλ λ°©λ²μ λν μμμ λλ€.
// ν μ€λ
μ·μ μμν©λλ€.
let snapshot1 = performance.heapSnapshot();
// λ©λͺ¨λ¦¬ λμλ₯Ό μ λ°νλ μ΄λ€ λμμ μνν©λλ€.
for (let i = 0; i < 100000; i++) {
myArray.push({
largeData: new Array(1000000).fill('some data'),
id: i,
});
}
// λ€λ₯Έ ν μ€λ
μ·μ μ€νν©λλ€.
let snapshot2 = performance.heapSnapshot();
// λ μ€λ
μ·μ λΉκ΅νμ¬ μ΄λ€ κ°μ²΄κ° μμ±λμλμ§ νμΈν©λλ€.
let diff = snapshot2.compare(snapshot1);
// μ°¨μ΄λ₯Ό λΆμνμ¬ μ΄λ€ κ°μ²΄κ° κ°μ₯ λ§μ λ©λͺ¨λ¦¬λ₯Ό μ¬μ©νλμ§ νμΈ ν©λλ€.
diff.forEach(function(item) {
if (item.size > 1000000) {
console.log(item.name);
}
});
μ΄ μμ μμλ λμ©λ λ°μ΄ν°λ₯Ό λ°°μ΄λ‘ νΈμνλ 루νλ₯Ό μ€ννκΈ° μ νμ λ κ°μ ν μ€λ μ·μ μμ±ν λ€μ, λ μ€λ μ·μ λΉκ΅νμ¬ λ£¨ν μ€μ μμ±λ κ°μ²΄λ€μ νμΈν©λλ€. κ·Έλ° λ€μ μ°¨μ΄λ₯Ό λΆμνμ¬ μ΄λ€ κ°μ²΄κ° κ°μ₯ λ§μ λ©λͺ¨λ¦¬λ₯Ό μ¬μ©νλμ§ νμΈν μ μμΌλ©°, μ΄λ₯Ό ν΅ν΄ λμ©λ λ°μ΄ν°λ‘ μΈν λ©λͺ¨λ¦¬ λμλ₯Ό μλ³νλ λ° λμμ΄ λ μ μμ΅λλ€.
νλ‘νμΌλ¬λ₯Ό μ¬μ©νλ©΄ μ ν리μΌμ΄μ μ μ±λ₯μ μΆμ νκ³ λ©λͺ¨λ¦¬ μ¬μ©λμ΄ λ§μ μμμ μλ³ν μ μμ΅λλ€.
let profiler = new Profiler();
profiler.start();
// λ©λͺ¨λ¦¬ λμλ₯Ό μ λ°νλ μ΄λ€ λμμ μνν©λλ€.
for (let i = 0; i < 100000; i++) {
myArray.push({
largeData: new Array(1000000).fill('some data'),
id: i,
});
}
profiler.stop();
let report = profiler.report();
// λ³΄κ³ μλ₯Ό λΆμνμ¬ λ©λͺ¨λ¦¬ μ¬μ©λμ΄ λ§μ μμμ μλ³ν©λλ€.
for (let func of report) {
if (func.memory > 1000000) {
console.log(func.name);
}
}
μ΄ μμ μμλ μλ°μ€ν¬λ¦½νΈ νλ‘νμΌλ¬λ₯Ό μ¬μ©νμ¬ μ ν리μΌμ΄μ μ μ±λ₯ μΆμ μ μμ λ° μ€μ§νκ³ μμ΅λλ€. λ³΄κ³ μμλ νΈμΆλ ν¨μμ κ° ν¨μμ λν λ©λͺ¨λ¦¬ μ¬μ©λμ λν μ λ³΄κ° νμλ©λλ€.
ν μ€λ μ·κ³Ό νλ‘νμΌλ¬λ λͺ¨λ μλ°μ€ν¬λ¦½νΈ μμ§κ³Ό λΈλΌμ°μ μμ μ§μλλ κ²μ μλλ―λ‘ μ ν리μΌμ΄μ μμ μ¬μ©νκΈ° μ μ νΈνμ±μ νμΈνλ κ²μ΄ μ€μν©λλ€.
μ΄μ κΉμ§ κ°λΉμ§ 컬λ μ νλ‘μΈμ€, λ€μν λ©λͺ¨λ¦¬ μ ν, μλ°μ€ν¬λ¦½νΈμμ μ¬μ©ν μ μλ λ©λͺ¨λ¦¬ κ΄λ¦¬ λꡬμ κΈ°λ² λ± μλ°μ€ν¬λ¦½νΈ λ©λͺ¨λ¦¬ κ΄λ¦¬μ κΈ°λ³Έμ μ΄ν΄λ³΄μμ΅λλ€. λν λ©λͺ¨λ¦¬ λμμ μΌλ°μ μΈ μμΈμ λν΄ μ€λͺ νκ³ μ΄λ₯Ό λ°©μ§νλ λ°©λ²μ λν μμλ₯Ό μ 곡νμ΅λλ€.
μ΄λ¬ν λ©λͺ¨λ¦¬ κ΄λ¦¬ λͺ¨λ² μ¬λ‘λ₯Ό μ΄ν΄νκ³ κ΅¬ννλ λ° μκ°μ ν¬μνλ©΄ λ©λͺ¨λ¦¬ λμ κ°λ₯μ±μ μ€μ΄λ©° μ ν리μΌμ΄μ μ λ§λ€μ΄λΌ μ μμ΅λλ€. μ΄ κΈμ΄ λμμ΄ λμλ€λ©΄ λ°μλ₯Ό 보λ΄μ£Όμ μ μμν΄μ£Όμκ³ , Mediumμμ μ λ₯Ό νλ‘μ°νμ¬ κΈ°μ μ ν λ¨κ³ λ λ°μ μν€λ λ° λμμ΄ λλ μλ‘μ΄ κΈκ³Ό νμ΅ κΈ°νμ λν μ΅μ μμμ λ°μ보μΈμ.
π νκ΅μ΄λ‘ λ νλ°νΈμλ μν°ν΄μ λΉ λ₯΄κ² λ°μλ³΄κ³ μΆλ€λ©΄ Korean FE Article(https://kofearticle.substack.com/)μ ꡬλ ν΄μ£ΌμΈμ!