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://simonmcmanus.wordpress.com/2013/01/03/forcing-garbage-collection-with-node-js-and-v8/
- http://faq.hostway.co.kr/Linux_ETC/4258
'Nodejs' 카테고리의 다른 글
Node.js 10가지 놀라운 프로젝트 (0) | 2013.12.21 |
---|---|
Nodejs Express Middleware 사용하기 (0) | 2013.11.12 |
Express req.param 사용 하기 (0) | 2013.09.23 |
Nodejs winston 표준 시간이 안맞는 경우 해결 방법 (0) | 2013.09.23 |
Nodejs cluster process 값 공유 하기 (0) | 2013.08.29 |