[node.js] 메모리 누수 방지(memory leaks)

Hyo Kyun Lee·2021년 7월 26일
0

node.js

목록 보기
16/34

1. 메모리 누수(memory leaks)

메모리 누수는 두가지 형태가 있다.

  • 메모리를 사용할 수 있음에도 불구하고 가용한 자원으로 인식되지 않는 상태
  • 메모리 참조후 해제를 하지 않아 실수로 메모리를 사용하지 못하는 상태

메모리 누수는 시스템 자원 활용 관점에서 봐야할 문제로, 코드상에서 메모리 누수 양상을 파악하는 것은 쉽지 않다.

그러나, 메모리 누수 관점에서 보았을때 risk가 있는 logic 및 코드는 존재한다.

전역변수의 무분별한 사용

  • global 객체의 사용
  • 프로젝트 내 전역으로 사용할 변수의 선언(global foo = value)

명시되지않는 비동기 처리 상황에서의 setinterval 사용

setInterval(function(){
  	foo = value
  	//logic
},1000);

위 로직에서 setInterval 함수는 foo 변수에 value를 할당하고, 1000ms의 최소지연시간을 가지게 된다.

이 setInterval 함수 내의 foo 변수는 비동기처리로 인해 언제 호출될지 모르는 상황이고, generator의 yield 처리처럼 계속 변수자체는 활성화되어있는 상태이다.

따라서 이 변수에 대해 명시적으로 사용하지 않거나, 변수해제를 해줘야 불필요한 메모리 공간을 차지하고 있는 상황이 발생하지 않는다.

Closure

Closure은 함수 내부에 또다른 함수를 호출하는 로직을 일컫는다.

만약 closure logic에서 다른 함수를 호출하면서, 해당 함수의 변수가 사용되지 않음에도 불필요한 변수활용(분기점, 조건 등)이 있을 경우 메모리 누수가 발생할 수 있다.

logic_1 () => {
  bar_1 = this_value
  bar_2 = logic_2 => {
    if(bar_1){
      return true
    }
  }
}

위 코드에서 bar_1에 대한 분기가 closure logic에서 발생하고 있다.

bar_1이 null 일 경우 메모리 누수는 발생하지 않겠지만, 별도의 명시적인 선언이 없다면 bar_1을 할당받을 상황을 대비해 계속 메모리가 활성화된다.

2. 메모리 누수방지 및 확인

'use strict'

무분별한 전역변수의 사용 등 javascript는 이러한 코드단의 메모리 누수를 최소화하거나, 로직 상 문제발생을 최소화하기위해 use strict라는 피드백을 제공한다.

최근 사용하는 ES6문법에서 strict mode를 통해 사용자는 예기치 못한 메모리 누수를 넘어, 코드 상 발생할 수 있는 이슈를 사전에 방지할 수 있다.

CPU Collector

메모리 누수는 앞서 기술하였듯이 단순히 코드 차원에서 파악하기가 쉽지 않은 이슈이기 때문에, CPU Collector 등 시스템 차원에서 접근하여 메모리 누수가 일어나는지 확인이 필요하다.

용량이 작은 프로젝트나 규모가 작다면 메모리 누수 이슈가 발생하지 않을 수 있겠지만, 용량이 커졌을 경우 시스템 자원 사용의 효율성을 증가시키기 위해 확인이 필요하다.

3. 참조링크

https://itstory.tk/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%88%84%EC%88%98%EC%9D%98-4%EA%B0%80%EC%A7%80-%ED%98%95%ED%83%9C

0개의 댓글