[🚜] Out of Memory λ°œμƒ μ΄μœ μ™€ ν•΄κ²° 방법

또띠·2024λ…„ 6μ›” 11일

νšŒμ‚¬μ—μ„œ μž‘μ—…μ„ ν•˜λ˜ 쀑, μƒˆλ‘œκ³ μΉ¨ ν•˜λ©΄ κ°„ν—μ μœΌλ‘œ Out of Memory λ©”μ„Έμ§€κ°€ λ‚˜νƒ€λ‚˜λŠ” ν˜„μƒμ΄ λ°œμƒν–ˆλ‹€.

퍼블리싱 μž‘μ—… 쀑인데 이런 λ©”μ„Έμ§€κ°€ 계속 λœ¨λ‹ˆκΉŒ μ΄μƒν•΄μ„œ 원인과 해결법에 λŒ€ν•΄ μ•Œμ•„λ³΄μ•˜λ‹€.

πŸ€” λ°œμƒ 이유

일반적으둜 λ©”λͺ¨λ¦¬κ°€ λΆ€μ‘±ν•  λ•Œ λ°œμƒν•œλ‹€.

1. λ¬΄ν•œ 루프 λ˜λŠ” μž¬κ·€ 호좜: μ΄λŠ” λ©”λͺ¨λ¦¬λ₯Ό λΉ λ₯΄κ²Œ μ†Œλͺ¨ν•˜κΈ° λ•Œλ¬Έμ—, 전체적인 μ½”λ“œλ₯Ό κ²€ν† ν•˜μ—¬ λ¬΄ν•œ 루프 λ˜λŠ” μž¬κ·€ 호좜이 μžˆλŠ”μ§€ 확인해야 ν•œλ‹€.

2. λŒ€λŸ‰μ˜ 데이터 처리: λŒ€λŸ‰μ˜ 데이터λ₯Ό ν•œ λ²ˆμ— μ²˜λ¦¬ν•˜λ €κ³  ν•˜λ©΄ λ©”λͺ¨λ¦¬ λΆ€μ‘± 였λ₯˜κ°€ λ°œμƒν•  수 μžˆλ‹€. 데이터λ₯Ό μž‘μ€ λ‹¨μœ„λ‘œ λ‚˜λˆ„μ–΄ μ²˜λ¦¬ν•˜κ±°λ‚˜, ν•„μš”ν•˜μ§€ μ•Šμ€ 데이터λ₯Ό λ©”λͺ¨λ¦¬μ—μ„œ ν•΄μ œν•΄μ•Ό ν•œλ‹€.

3. λ©”λͺ¨λ¦¬ λˆ„μˆ˜: μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬κ°€ ν•΄μ œλ˜μ§€ μ•Šμ•„ μ‹œκ°„μ΄ 지남에 따라 점차 λ©”λͺ¨λ¦¬κ°€ λΆ€μ‘±ν•΄μ§€λŠ” ν˜„μƒμœΌλ‘œ λ©”λͺ¨λ¦¬ 관리 κ°œμ„  ν•„μš”ν•˜λ‹€.

4. λΈŒλΌμš°μ € λ˜λŠ” ν™˜κ²½μ˜ λ©”λͺ¨λ¦¬ μ œν•œ: 일뢀 λΈŒλΌμš°μ € λ˜λŠ” ν™˜κ²½μ—μ„œλŠ” λ©”λͺ¨λ¦¬ μ‚¬μš©μ— μ œν•œμ„ 두고 μžˆμ„ μˆ˜λ„ μžˆλ‹€. μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ μ€„μ΄κ±°λ‚˜, μ œν•œμ„ λŠ˜λ¦¬λŠ” 방법 μ°Ύμ•„μ•Ό ν•œλ‹€.


😊 ν•΄κ²° 방법 (feat. Vue.js)

1. 이벀트 λ¦¬μŠ€λ„ˆ ν•΄μ œ: μ»΄ν¬λ„ŒνŠΈ 파괴될 λ•Œ 이벀트 λ¦¬μŠ€λ„ˆλ₯Ό ν•΄μ œ μ‹œμΌœμ€€λ‹€.
beforeUnmonet λ˜λŠ” unmonted 라이프사이클 ν›…μ—μ„œ removeEventListener ν˜ΈμΆœμ„ 톡해 λ¦¬μŠ€λ„ˆλ₯Ό ν•΄μ œν•œλ‹€.

2. 타이머 ν•΄μ œ: setTimeout λ˜λŠ” setInterval을 μ‚¬μš©ν•œ 경우, μ»΄ν¬λ„ŒνŠΈ 파괴될 λ•Œ 타이머λ₯Ό ν•΄μ œν•΄μ•Ό 함. 이λ₯Ό μœ„ν•΄ clearTimeout λ˜λŠ” clearInterval을 ν˜ΈμΆœν•΄μ•Ό ν•œλ‹€.
(vue.jsμ—μ„œλŠ” beforeUnmount 라이프사이클 ν›…μ—μ„œ clearTimeout을 ν˜ΈμΆœν•˜μ—¬ 타이머λ₯Ό ν•΄μ œ)

타이머λ₯Ό ν•΄μ œν•˜μ§€ μ•ŠμœΌλ©΄ ν•΄λ‹Ή νƒ€μ΄λ¨ΈλŠ” 계속 μ‹€ν–‰λ˜μ–΄ λ©”λͺ¨λ¦¬λ₯Ό μ μœ ν•˜κ²Œ λ©λ‹ˆλ‹€. μ΄λŠ” νŽ˜μ΄μ§€μ˜ μ„±λŠ₯을 μ €ν•˜μ‹œν‚€κ³ , μ΅œμ•…μ˜ 경우 "Out of memory" 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚¬ 수 μžˆλ‹€.

πŸ’‘Tip

setTimeoutκ³Ό 같은 타이머 ν•¨μˆ˜λŠ” λΈŒλΌμš°μ €μ˜ 이벀트 루프에 μ˜ν•΄ κ΄€λ¦¬λ˜λ©°, νŽ˜μ΄μ§€λ₯Ό μ΄λ™ν•˜λ”λΌλ„ ν•΄λ‹Ή 타이머가 μ„€μ •λœ νŽ˜μ΄μ§€μ˜ μ»¨ν…μŠ€νŠΈμ—μ„œ 계속 μ‹€ν–‰λ©λ‹ˆλ‹€. μ΄λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ μ‹±κΈ€ μŠ€λ ˆλ“œλ‘œ λ™μž‘ν•˜λ©°, λΉ„λ™κΈ°μ μœΌλ‘œ 이벀트λ₯Ό μ²˜λ¦¬ν•˜λŠ” νŠΉμ„± λ•Œλ¬Έμž…λ‹ˆλ‹€.

3. Reactive 객체 μ°Έμ‘° ν•΄μ œ: vue λ°˜μ‘ν˜• μ‹œμŠ€ν…œμ€ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό μΌμœΌν‚¬ 수 μžˆμœΌλ―€λ‘œ, μ»΄ν¬λ„ŒνŠΈ 파괴 μ‹œ μ»΄ν¬λ„ŒνŠΈλ₯Ό ν•΄μ œν•΄μ•Ό ν•œλ‹€.

4. λ©”λͺ¨λ¦¬ 관리 도ꡬ μ‚¬μš©: λΈŒλΌμš°μ € 개발자 도ꡬλ₯Ό 톡해 λ©”λͺ¨λ¦¬ λˆ„μˆ˜ 감지 및 디버깅 κ°€λŠ₯ν•˜λ‹€.
크둬 > λ©”λͺ¨λ¦¬ νƒ­ > Heap snapshot을 μΊ‘μ³ν•˜μ—¬ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ 뢄석할 수 μžˆλ‹€.


κ·Έλž˜μ„œ λ°”λ‘œ 전체 검색을 톡해 μš°μ„ μ μœΌλ‘œ 이벀트 λ¦¬μŠ€ν„°κ°€ μ–Όλ§ŒνΌ μ–΄λ–»κ²Œ μ‚¬μš©λ˜κ³  μžˆλŠ”κ°€λ₯Ό μ‚΄νŽ΄ λ³΄μ•˜λ‹€. λͺ‡λͺ‡κ°œμ˜ 이벀트 λ¦¬μŠ€λ„ˆλ₯Ό λ°œκ²¬ν–ˆκ³  μΆ”κ°€μ μœΌλ‘œ Observerμ—μ„œλ„ 쀑단 처리λ₯Ό ν•΄ μ€˜μ•Όν•œλ‹€λŠ” λ™λ£Œμ˜ νŒμ„ λ°›μ•˜λ‹€.

const observer = new IntersectionObserver((entries, observer) => {
    entries.forEach(entry => {
        if (entry.isIntersecting) {
            // ...
            observer.unobserve(entry.target);
        }
    });
});

// 관찰을 μ‹œμž‘
observer.observe(element);

// λ‚˜μ€‘μ— λͺ¨λ“  관찰을 쀑단
observer.disconnect();
profile
✨ π‘¬π’—π’†π’“π’šπ’•π’‰π’Šπ’π’ˆ π’„π’π’Žπ’†π’” 𝒕𝒐 π’‰π’Šπ’Ž π’˜π’‰π’ 𝒉𝒖𝒔𝒕𝒍𝒆𝒔 π’˜π’‰π’Šπ’π’† 𝒉𝒆 π’˜π’‚π’Šπ’•π’”. ✨

0개의 λŒ“κΈ€