Nodejs 는 Chrome의 V8 엔진을 기반으로 구축된 platform 입니다. C/C++로 구현 되어 있습니다.


독립적인 platform 이기 때문에 운영체제에 영향을 받지 않습니다. 비슷한 언어로는 Java 가 있는데 JVM(Java Virtual Machine) 이라는 가상 머신이 존재 합니다.


위와 같은 언어는 메모리 관리를 엔진이나 가상 머신 에게 위임 하기 때문에 개발자가 메모리 관리를 하지 않고 비지니스 로직에 집중해서 개발이 가능 합니다.


개발자들이 흔하게 얘기하는 Garbage Collection (GC) 가 메모리 관리를 하는 행위 입니다.


2가지 방법으로 테스트를 해봤습니다. 

약 10분 정도 실행을 했습니다.


자동 GC

Sample Code 

var uuid = require('node-uuid');


function _a() {

  console.log('create _a');

}


function _b() {

  console.log('create _b');

}


while(true) {

  global[uuid.v1()] = new _a();

  global[uuid.v1()] = new _b();

}


메모리 정보

Name:   node

State:  R (running)

Tgid:   4266

Pid:    4266

PPid:   3056

TracerPid:      0

Uid:    1000    1000    1000    1000

Gid:    1000    1000    1000    1000

FDSize: 256

Groups: 4 24 27 30 46 109 124 1000

VmPeak:  2749292 kB

VmSize:  2748676 kB  - (전체 할당된 가상 메모리 크기)

VmLck:         0 kB

VmPin:         0 kB

VmHWM:   1862144 kB

VmRSS:   1827840 kB  - (실제 물리적 메모리 할당된 크기)

VmData:  2721992 kB  - (Heap 영역)

VmStk:       136 kB - (Stack 영역)

VmExe:      8024 kB

VmLib:      4084 kB

VmPTE:      6716 kB

VmSwap:   303584 kB

Threads:        2

SigQ:   0/15889

SigPnd: 0000000000000000

ShdPnd: 0000000000000000

SigBlk: 0000000000000000

SigIgn: 0000000000001000

SigCgt: 0000000188004202

CapInh: 0000000000000000

CapPrm: 0000000000000000

CapEff: 0000000000000000

CapBnd: ffffffffffffffff

Cpus_allowed:   3

Cpus_allowed_list:      0-1

Mems_allowed:   00000000,00000001

Mems_allowed_list:      0

voluntary_ctxt_switches:        5762

nonvoluntary_ctxt_switches:     4740072


수동 GC

Sample Code 

var uuid = require('node-uuid');


function _a() {

  console.log('create _a');

}


function _b() {

  console.log('create _b');

}


while(true) {

  global[uuid.v1()] = new _a();

  global[uuid.v1()] = new _b();

  gc(true);

}


실행 시 --expose-gc 옵션을 줘야 한다.

node --expose-gc test.js


메모리 정보

Name:   node

State:  R (running)

Tgid:   4375

Pid:    4375

PPid:   3056

TracerPid:      0

Uid:    1000    1000    1000    1000

Gid:    1000    1000    1000    1000

FDSize: 256

Groups: 4 24 27 30 46 109 124 1000

VmPeak:   718700 kB

VmSize:   700416 kB  - (전체 할당된 가상 메모리 크기)

VmLck:         0 kB

VmPin:         0 kB

VmHWM:     53492 kB

VmRSS:     53492 kB  - (실제 물리적 메모리 할당된 크기)

VmData:   673732 kB  - (Heap 영역)

VmStk:       136 kB - (Stack 영역)

VmExe:      8024 kB

VmLib:      4084 kB

VmPTE:       288 kB

VmSwap:        0 kB

Threads:        2

SigQ:   0/15889

SigPnd: 0000000000000000

ShdPnd: 0000000000000000

SigBlk: 0000000000000000

SigIgn: 0000000000001000

SigCgt: 0000000188004202

CapInh: 0000000000000000

CapPrm: 0000000000000000

CapEff: 0000000000000000

CapBnd: ffffffffffffffff

Cpus_allowed:   3

Cpus_allowed_list:      0-1

Mems_allowed:   00000000,00000001

Mems_allowed_list:      0

voluntary_ctxt_switches:        68

nonvoluntary_ctxt_switches:     80441


위 2가지 상황의 실제 물리적 메모리 할당 크기 를 비교 해보면 약 34배 정도의 차이를 볼 수 있습니다.


실제로 프로그램의 규모가 커지고 Web Application 이라면 접속자가 많아 질수록 메모리 관리의 중요성은 커질 것이라고 생각합니다. 


※ 참고 사이트

 - http://blog.nerds.kr/

 - http://simonmcmanus.wordpress.com/2013/01/03/forcing-garbage-collection-with-node-js-and-v8/

 - http://faq.hostway.co.kr/Linux_ETC/4258


+ Recent posts