목차

반응형

1. 오류

2. 해결방법

 

 

 

1. 오류

노드를 하다 보면 아래와 같은 오류를 만날 수 있다.

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory

<--- Last few GCs --->


[26828:0000020CB062E7D0]   706683 ms: Scavenge 7849.4 (8214.7) -> 7839.2 (8214.7) MB, 556.0 / 0.0 ms  (average mu = 0.131, current mu = 0.014) allocation failure 
Writing Node.js report to file: report.20200214.173258.26828.0.001.json[26828:0000020CB062E7D0]   708430 ms: Scavenge 7851.5 (8214.7) -> 7842.8 (8215.7) MB, 1247.6 / 0.0 ms  (average mu = 0.131, current mu = 0.014) allocation failure 
[26828:0000020CB062E7D0]   708535 ms: Scavenge 7855.6 (8215.7) -> 7846.4 (8218.7) MB, 32.1 / 0.0 ms  (average mu = 0.131, current mu = 0.014) allocation failure 


<--- JS stacktrace --->

==== JS stack trace =========================================

    0: ExitFrame [pc: 00007FF742BAB21D]
Security context: 0x0314ac3808d1 <JSObject>
    1: /* anonymous */ [000002D987624109] [C:\Users\Desktop\project\node_modules\jsonparse\jsonparse.js:~127] [pc=000001C121A8459D](this=0x0314ac3b5539 <Parser map = 0000007B595C11A9>,0x02a34c9a8251 <Uint8Array map = 00000236682E5379>)
    2: /* anonymous */ [00000314AC3B0549] [C:\Users\Desktop\project\node_modules\JSONStream\inde...


Node.js report completed
 1: 00007FF741FAF22F napi_wrap+125087
 2: 00007FF741F4FAA6 public: bool __cdecl v8::base::CPU::has_sse(void)const __ptr64+35302
 3: 00007FF741F50776 public: bool __cdecl v8::base::CPU::has_sse(void)const __ptr64+38582
 4: 00007FF742767D4E private: void __cdecl v8::Isolate::ReportExternalAllocationLimitReached(void) __ptr64+94
 5: 00007FF742750371 public: class v8::SharedArrayBuffer::Contents __cdecl v8::SharedArrayBuffer::Externalize(void) __ptr64+833
 6: 00007FF74261BDEC public: static void __cdecl v8::internal::Heap::EphemeronKeyWriteBarrierFromCode(unsigned __int64,unsigned __int64,class v8::internal::Isolate * __ptr64)+1436
 7: 00007FF742627040 public: void __cdecl v8::internal::Heap::ProtectUnprotectedMemoryChunks(void) __ptr64+1312
 8: 00007FF742623B64 public: static bool __cdecl v8::internal::Heap::PageFlagsAreConsistent(class v8::internal::HeapObject)+3204
 9: 00007FF742619373 public: bool __cdecl v8::internal::Heap::CollectGarbage(enum v8::internal::AllocationSpace,enum v8::internal::GarbageCollectionReason,enum v8::GCCallbackFlags) __ptr64+1283
10: 00007FF7426179E4 public: void __cdecl v8::internal::Heap::AddRetainedMap(class v8::internal::Handle<class v8::internal::Map>) __ptr64+2452
11: 00007FF742638C7D public: class v8::internal::Handle<class v8::internal::HeapObject> __cdecl v8::internal::Factory::NewFillerObject(int,bool,enum v8::internal::AllocationType,enum v8::internal::AllocationOrigin) __ptr64+61
12: 00007FF74239CF71 public: class v8::internal::interpreter::JumpTableTargetOffsets::iterator & __ptr64 __cdecl v8::internal::interpreter::JumpTableTargetOffsets::iterator::operator=(class v8::internal::interpreter::JumpTableTargetOffsets::iterator && __ptr64) __ptr64+1681
13: 00007FF742BAB21D public: virtual bool __cdecl v8::internal::SetupIsolateDelegate::SetupHeap(class v8::internal::Heap * __ptr64) __ptr64+544781
14: 000001C121A8459D 

Process finished with exit code 134

궁금할 것도 없이 과도한 메모리 점유로 인하여 js 엔진이 폭발해버린 것이다.

 

 

노드를 돌리고 있는데 노드의 메모리가 엄청나게 올라간다.

아니 도대체 뭘하길래 저렇게 올라가느냐...?

내가 하고 있는 작업은 10GB 정도 되는 json 데이터를 stream pipe로 가져와서 읽는 작업을 한다.

개발 초기단계에는 몰랐지만 두곳에서 엄청난 메모리 누수가 발생하고 있어서 데이터를 읽을수록 메모리 점유가 계속해서 올라가는 문제가 있었다.

 

노드의 기본 메모리 사이즈는 512MB다.

 

 

 

2. 해결방법

근본적인 생각해볼만한 것은 두 가지가 있다.

1. 더 큰 메모리 할당

2. 앱 메모리 누수 개선

 

1번의 경우 노드 옵션 설정이기 때문에 정말 간단하다.

정말 어려운 것은 2번이다. 노드가 어디에서 메모리 누수가 일어나는지 확인하는 것이 여간 쉽지 않고 어디 나와있지도 않은 부분이다.

앱 메모리 누수를 개선하는 방법에 초점을 맞춰 글을 써 나가도록 하겠다.

 

 

 

Nodejs 메모리 관련 글

Nodejs - 메모리 JavaScript heap out of memory

Nodejs - 메모리 할당 사이즈 변경

Nodejs - 메모리 누수 확인

반응형