Javascript Memory Leak

created : 2020-04-07T11:16:46+00:00
modified : 2022-03-14T17:23:25+00:00

계개모 계룡전산한마당 gc

주제 후보

→ 익명의 대학 동기에게 재밋는 주제를 고르라고 해서 진행되었습니다.

메모리 누수란 왜 일어나는가?

결론부터 말하자면 프로그래머의 실수. 코딩 습관을 잘 들이자.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {
    int n;
    scanf("%d",&n);
    int* arr = (int*)malloc(sizeof(int) * n);
    // do something
    free(arr);
    return 0;
}
- → 소프트웨어의 규모가 커지고 협업이 증가하면서 메모리를 책임지지 못하게 되었다.
- →Garbage Collection의 필요성 (cf. rust 의 memory ownership)
    - 단, 최초의 GC는 LISP 이라는 언어에서부터 있었다고 알려져있음.(1958년)

Garbage Collection

초기 아이디어 - 참조 카운트(Reference Counting)

A a = new A();
a.b = new B();
a.b.c = new C();


a.b.c = null;

f();


void f() {
  A a = new A();
 // do something
}

이 때 f 메서드 바깥에서는 a가 사용되지 않는다.

a가 가르키던 메모리 공간에 대해서 f가 끝나면 reference count가 감소하여 reference count가 0이 되었다고 판단하고 gc가 할당을 해제한다.

A a = new A();
B b = new B();
a.refB = b;
b.refA = a;
a = null;
b = null;

a와 b의 공간에 더이상 접근가능한 객체가 없음에도 불구하고 a와 b의 reference count 는 각각 1이기 때문에 gc가 메모리 해제를 하지 않는다.

도달 가능한 (reachable) 객체만 남기자 - Mark and Sweep

gc.png

출처 : https://en.wikipedia.org/wiki/Tracing_garbage_collection#Naïve_mark-and-sweep

단점

Generational Algorithm

데블스캠프2017/Internal Of Java Script Core’s Garbage Collector

자바스크립트에서 메모리 누수의 4가지 형태

NAVER D2

[Rust] 러스트의 꽃, Ownership 파헤치기

Memory Management

https://www.ps.uni-saarland.de/courses/gc-ws01/slides/generational_gc.pdhttps://www.ibm.com/developerworks/web/library/wa-memleak/wa-memleak-pdf.pdf

function foo(arg) {
  bar = "global variable";
}


function foo(arg) {
  window.bar = "global variable";
}

var someResource =getData();
setInterval(function() {
  var node = document.getElementById('Node');
  if (node) {
    // something
    node.innerHTML = JSON.stringify(someResource);
  }
}, 1000);

Garbage collection

mbbill/JSC.js

https://www.ibm.com/developerworks/web/library/wa-memleak/wa-memleak-pdf.pdf