매일 업데이트
2023-03-21 07:48 9 min

"JavaScript 힙 메모리 부족 오류" 수정 방법

자바스크립트는 그 다재다능함 덕분에 가장 널리 사용되는 프로그래밍 언어 중 하나로 자리매김했습니다. 웹 브라우저 환경 외부에서 자바스크립트를 실행하고자 할 때, 개발자들은 플랫폼 간 호환성을 제공하는 런타임 환경인 Node.js를 필수적으로 설치해야 합니다.

자바스크립트 힙 메모리 부족 오류는 Node.js 환경에서 자바스크립트 프로젝트를 실행하는 과정에서 흔히 발생하는 문제입니다.

이 오류는 컴퓨터 시스템이 할당한 기본 메모리 용량이 대규모 프로젝트를 처리하기에 충분하지 않을 때 나타나며, 시스템이 메모리 부족으로 인해 프로그램 실행을 중단시키는 결과를 초래합니다.

힙 메모리 부족 오류가 발생하면 프로그램은 즉시 중단되며, 다음과 유사한 오류 메시지를 출력하게 됩니다:

심각한 오류: CALL_AND_RETRY_LAST 할당 실패 – 자바스크립트 힙 메모리 부족

또는

심각한 오류: 유효하지 않은 테이블 크기 할당 실패 – 자바스크립트 힙 메모리 부족

자바스크립트 힙 메모리 부족 오류의 주요 원인들

  • 과도한 데이터 구조: 거대한 크기의 행렬이나 배열 같은 데이터 구조를 다루는 작업은 상당한 메모리 공간을 요구하며, 이러한 요구는 결국 메모리 부족 오류로 이어질 수 있습니다.

다음은 10억 개의 요소를 포함하는 거대한 데이터 구조를 사용하는 예시입니다.

let array = [];

for (let i = 0; i < 1000000000; i++) {

  array.push(i);

}
  • 비효율적인 메모리 관리: 애플리케이션의 규모가 커짐에 따라, 더 이상 필요하지 않은 객체들은 적절하게 해제되어야 합니다. 메모리 관리가 제대로 이루어지지 않으면 메모리 누수가 발생할 수 있습니다.

다음은 메모리 누수를 초래하는 함수의 예입니다:

let array = [];

setInterval(function() {

  array.push(new Array(1000000).join("x"));

}, 1000);
  • 무한 루프: 종료 조건 없이 영원히 실행되는 코드는 시스템 자원을 과도하게 소모하여 메모리 부족 오류를 유발할 수 있습니다.

다음은 무한 루프의 예시입니다:

while (true) {

   console.log(1);

}

무한 루프는 메모리를 매우 빠른 속도로 고갈시키므로, 이러한 종류의 오류를 쉽게 발생시킬 수 있습니다.

  • 재귀 함수: 재귀 함수는 특정 조건에 도달할 때까지 자기 자신을 호출하는 함수입니다. 제대로 설계되지 않은 재귀 함수는 메모리 과부하를 일으키고, 결국 메모리 부족 오류를 초래할 가능성이 큽니다.
  • 과도한 객체 사용: 코드 내에 많은 수의 대형 객체가 존재할 경우, 이 객체들이 소비하는 메모리가 누적되어 시스템 메모리가 과부하될 수 있습니다.

자바스크립트 힙 메모리 부족 오류 해결 방법

이 오류는 Windows, macOS, Ubuntu와 같은 다양한 운영 체제에서 발생할 수 있습니다. 다행히도, 사용 중인 운영 체제에 관계없이 이 오류를 해결할 수 있는 방법이 존재합니다.

#1. Windows OS에서 자바스크립트 힙 메모리 부족 오류 해결

1단계: 시작 메뉴에서 "고급 시스템 설정"을 검색하여 실행합니다.

2단계: 시스템 속성 창 하단의 "환경 변수" 버튼을 클릭합니다.

3단계: "사용자 변수" 또는 "시스템 변수" 섹션에서 "새로 만들기" 버튼을 클릭합니다. "사용자 변수"는 현재 사용자 계정에만 변경 사항을 적용하며, "시스템 변수"는 전체 시스템에 변경 사항을 적용합니다.

4단계: 새 변수 만들기 창에서 "변수 이름" 항목에 `NODE_OPTIONS`를 입력하고, "변수 값" 항목에 `--max-old-space-size=4096`을 입력합니다. 여기서 4096은 Node.js에 할당할 4GB의 가상 메모리를 나타냅니다. 필요에 따라 값을 늘려 더 많은 메모리를 할당할 수도 있습니다(예: `--max-old-space-size=8192`로 설정하여 8GB 할당).

5단계: "확인" 버튼을 클릭하여 변경 사항을 적용하고 창을 닫습니다.

Windows PowerShell 터미널을 사용하여 오류를 해결할 수도 있습니다. 터미널을 열고 다음 명령어를 입력하세요:

env:NODE_OPTIONS="--max-old-space-size=4096"

이 명령어를 앱 실행 전에 실행하면 일시적으로 오류를 해결할 수 있습니다.

set NODE_OPTIONS=--max-old-space-size=4096

#2. Linux에서 자바스크립트 힙 메모리 부족 오류 해결

  • 1단계: 오류의 원인을 파악하기 위해 콘솔 로그나 출력 메시지를 확인하여 오류를 유발하는 코드 또는 파일 라인을 찾습니다.
  • 2단계: 다음 명령어를 사용하여 Node.js에 할당할 가상 메모리 크기를 설정하는 환경 변수를 내보냅니다.
export NODE_OPTIONS=--max-old-space-size=4096

이 명령어는 Node.js에 4GB의 가상 메모리를 할당합니다. 오류가 지속될 경우 메모리 할당량을 두 배로 늘릴 수 있습니다.

예를 들어, 8GB의 가상 메모리를 할당하려면 다음 명령어를 실행합니다:

export NODE_OPTIONS=--max-old-space-size=8192

#3. macOS에서 자바스크립트 힙 메모리 부족 오류 해결

macOS에서도 Linux와 유사한 방식으로 자바스크립트 힙 메모리 부족 오류를 해결할 수 있습니다. 다음 단계를 따르세요:

  • 1단계: 콘솔 로그 또는 출력에서 오류를 유발하는 코드/파일 라인을 확인하여 오류의 원인을 정확히 찾아냅니다.
  • 2단계: 다음 명령어를 사용하여 Node.js에 할당할 가상 메모리 크기를 지정하는 환경 변수를 설정합니다.
export NODE_OPTIONS=--max-old-space-size=4096

이 명령어는 Node.js에 4GB의 가상 메모리를 할당합니다. 오류가 계속 발생하면 메모리 할당량을 두 배로 늘릴 수 있습니다.

예를 들어, 8GB의 가상 메모리를 할당하려는 경우 다음 명령을 실행합니다:

export NODE_OPTIONS=--max-old-space-size=8192

NPM 설치 과정에서 메모리 늘리기

지금까지 제시된 해결 방법들은 주로 Node.js 애플리케이션을 실행할 때 발생하는 오류에 적용됩니다. 하지만 자바스크립트 패키지를 설치하는 중에 메모리 부족 오류가 발생할 때도 가상 메모리를 할당하여 문제를 해결할 수 있습니다. 다음 명령어를 사용하세요:

node --max-old-space-size=4096 (which npm) install

참고: 가상 메모리 할당량은 필요에 따라 1GB, 2GB, 3GB 또는 4GB 단위로 늘릴 수 있습니다. 메모리 크기는 MB 단위로 지정해야 합니다. 그러나 시스템 전체 메모리를 Node.js에 할당하는 것은 피해야 합니다. 그렇게 하면 프로그램이 불안정해질 수 있습니다. 예를 들어, 시스템에 16GB의 RAM이 있다면 Node.js에는 최대 8GB까지 할당하는 것이 적절합니다.

자바스크립트 메모리 부족 오류 예방 방법

지금까지 자바스크립트 힙 메모리 부족 오류가 발생했을 때 해결하는 방법을 살펴봤습니다. 이제, 이러한 오류가 발생하지 않도록 예방하는 데 도움이 되는 몇 가지 방법들을 살펴보겠습니다:

#1. 데이터를 작은 단위로 분할

만약 ETL(추출, 변환, 로드) 프로세스를 통해 대용량 CSV 파일에서 데이터를 가져오는 Node.js 프로그램이 있다면, 데이터 로드 과정에서 애플리케이션이 충돌하는 것을 경험할 수 있습니다. MongoDB를 사용하는 경우, 다음과 같은 명령줄 명령을 사용하여 문제를 해결할 수 있습니다:

split -l 1000000 users.csv

이 명령어는 `users.csv` 파일을 1000000명 사용자를 포함하는 여러 개의 작은 파일로 분할하도록 지시합니다. `-l` 플래그는 파일이 코드 라인 수를 기준으로 분할되어야 함을 지정합니다.

#2. 메모리 사용량 모니터링

코드 내에서 메모리 누수를 감지하기 위해 메모리 프로파일러를 사용할 수 있습니다. Node.js의 내장 메모리 기능과 ChromeDevTools를 함께 사용하여 코드 내의 문제를 식별하고 해결할 수 있습니다.

또한 Datadog, New Relic 및 AppDynamics와 같은 외부 도구를 사용하여 애플리케이션의 성능을 모니터링하고 필요한 조치를 취할 수도 있습니다. `process.memoryUsage()` 메서드를 통해 Node.js 앱의 메모리 사용량을 확인할 수 있습니다.

#3. 메모리 누수 방지

Node.js 애플리케이션이 더 이상 필요하지 않은 객체에 대한 참조를 유지할 때 메모리 누수가 발생합니다. 이러한 객체가 가비지 컬렉션되지 않으면 시간이 지남에 따라 메모리 사용량이 증가합니다.

전역 변수 사용을 피하고, I/O 작업을 차단하지 않으며, 변수를 선언할 때 `var` 대신 `let`과 `const` 키워드를 사용하는 등 메모리 누수를 피하는 여러 방법이 있습니다.

#4. 분산 처리

Raspberry Pi와 같이 메모리가 제한된 시스템에서 Node.js를 실행할 때 메모리 부족 오류가 발생할 수 있습니다. 이 경우 하나의 마스터 프로세스를 설정하고 다른 프로세스를 작업자 그룹으로 구성할 수 있습니다. 마스터 프로세스는 시스템 메모리가 부족해지면 해당 프로세스를 종료하고 과부하가 걸리지 않은 다른 프로세스에 작업을 할당할 수 있습니다.

#5. 하드웨어 업그레이드

메모리 할당량을 늘리고 위에서 제시된 메모리 부족 오류 방지 방법을 모두 시도했음에도 불구하고 문제가 해결되지 않는다면 하드웨어 업그레이드를 고려해 볼 수 있습니다. Node.js는 최소 512MB의 RAM에서 실행 가능하지만, 애플리케이션의 규모가 커짐에 따라 더 많은 RAM이 필요합니다.

CPU 코어 수를 늘리는 것도 메모리 할당을 개선하는 데 도움이 될 수 있습니다. 이상적으로, 2개 이상의 CPU 코어를 사용하면 애플리케이션이 암호화 및 이미지 처리와 같은 CPU 집약적인 작업에 작업자 스레드를 효과적으로 활용할 수 있습니다.

FAQ

자바스크립트 힙 메모리 부족 오류의 원인은 무엇인가요?

이 오류는 여러 가지 이유로 발생할 수 있습니다:
1. 메모리 누수
2. 무한 루프
3. 프로젝트 내 과도한 객체 수
4. 과도한 크기의 데이터 구조 사용

자바스크립트 힙 메모리 부족 오류를 해결할 수 있나요?

네, 다음 방법들을 통해 해결할 수 있습니다:
1. Node.js에 더 많은 가상 메모리 할당
2. 메모리 누수 제거
3. 코드 최적화
4. 하드웨어 업그레이드

React 앱에서 힙 메모리 부족 오류를 어떻게 해결할 수 있나요?

React는 가장 인기 있는 자바스크립트 라이브러리 중 하나입니다. 프로젝트 루트 디렉터리에 있는 `package.json` 파일에서 `scripts` 섹션을 찾고, 다음 행과 같이 수정하세요:

"scripts": {

  "start": "react-scripts --max_old_space_size=4096 start",

  "build": "react-scripts --max_old_space_size=4096 build",

  "test": "react-scripts test",

  "eject": "react-scripts eject"

}

마무리

대부분의 개발자는 Node.js 프로그램을 실행할 때 런타임 오류보다는 버그 및 코드 오류에 익숙합니다. 다행히 힙 메모리 부족 오류는 해결 가능한 문제이므로 크게 걱정할 필요는 없습니다. 이 글에서는 자바스크립트 힙 메모리 부족 오류가 무엇인지 정의하고, 해결하는 방법과 Node.js 프로젝트에서 예방하는 방법을 설명했습니다.

다음으로는 흔히 발생하는 자바스크립트 오류를 피하는 방법에 대해 알아보는 것도 좋습니다.

저자
Korea

기술 트렌드와 실용적인 팁을 전하는 लेखक입니다.