
๊ฐ๋จํ ์คํฌ๋ฆฝํธ๋ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๊ฑฑ์ ์ ์ ํด๋ ๋ ๊น?
๊ฐ๋จํ ์คํฌ๋ฆฝํธ๋ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๊ฑฑ์ ์ ์ ํด๋ ๋ ๊น? ๊ด๋ จ
๋ก์ปฌ์์ ์คํฌ๋ฆฝํธ ์คํํ ๋, ๋ฉ๋ชจ๋ฆฌ๊น์ง ์๊ฐํด ๋ณด์ จ๋์?
์๋ฌด๋ฆฌ ๋จ์ํ ๋ฐ๋ณต ์์ ์ด๋ผ๋, ์ด์์ฒด์ ์์์ ๋์๊ฐ๋ ํ๋์ ํ๋ก์ธ์ค๋ผ๋ ์ฌ์ค์ ์์ผ๋ฉด ๋ญํจ๋ฅผ ๋ณผ ์ ์๋ค. ์ต๊ทผ AWS S3์ ๋ฐฑ์ ํด ๋ DynamoDB ๋ฐ์ดํฐ๋ฅผ ๋๋์ผ๋ก ์ฝ๋ ์์ ์ ํ๋ค๊ฐ, ๋์ค์ โOut of Memoryโ ์๋ฌ๋ก ์์ ์ด ์ค๋จ๋๋ ๋ฌธ์ ๋ฅผ ๊ฒช์๋ค. ๊ณผ์ฐ ๋ด๊ฐ ๋ญ ์๋ชปํ ๊ฑธ๊น?
ํด๋น ์คํฌ๋ฆฝํธ๋ Node.js v20 ํ๊ฒฝ์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์์ฑ๋์๊ณ , ๋น์ ๋๋ ๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ ํ๊บผ๋ฒ์ ๋ฐฐ์ด์ ๋ด์ ํ, ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ๋์์ผ๋ก Promise.allSettled()๋ฅผ ์ด์ฉํ ๋ณ๋ ฌ ์ฒ๋ฆฌ ๋ฐฉ์์ ํํ๋ค. ์คํ ์๋๋ฅผ ๋์ด๋ ๋ฐ๋ ์ฑ๊ณตํ์ง๋ง, ์ด ๋ฐฉ์์ ์ฒ๋ฆฌ๋์ด ๋ง์์ง์๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง๋์น๊ฒ ๋ง์ด ์ฐจ์งํ๊ฒ ๋์๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก Node.js์ ํ ๋ฉ๋ชจ๋ฆฌ ํ๊ณ๋ฅผ ์ด๊ณผํ๋ฉด์ โOut of Memoryโ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ๊ฒฐ๊ตญ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๋นํ์ง ๋ชปํ ์คํฌ๋ฆฝํธ๋ ์ค๋จ๋์๋ค.
์ด๋ฒ ๊ฒฝํ์ ํตํด ๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋๋ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ ์ข์ง๋ง, ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ์ธ์ง ๋จผ์ ๊ณ ๋ฏผํด์ผ ํ๋ค๋ ๊ตํ์ ์ป์๋ค. ์ด๋ฒ ๊ธ์์๋ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋ ๊ณผ์ ์์ ์ด๋ค ์ค์๊ฐ ์์๊ณ , ์ด๋ฅผ ์ด๋ป๊ฒ ๊ฐ์ ํ๋์ง ๋จ๊ณ๋ณ๋ก ์ ๋ฆฌํด ๋ณด๋ ค๊ณ ํ๋ค.

๋ฌด์ฌ์ฝ ์ง๋์น ํ ๋ฉ๋ชจ๋ฆฌ
ํ๊ณผ ์คํ: ๋ฉ๋ชจ๋ฆฌ๋ ์ด๋์ ์ ์ฅ๋ ๊น?
๋จผ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ํด ๊ฐ๋จํ ์ ๋ฆฌํด ๋ณด์. ์ปดํจํฐ ํ๋ก๊ทธ๋จ์ด ์คํ๋ ๋ ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ๋ ํฌ๊ฒ ๋ ์์ญ์ผ๋ก ๋๋๋ค. ์คํ(Stack)๊ณผ ํ(Heap)์ด๋ค.
- **์คํ(Stack)**์ ํจ์ ํธ์ถ, ์ง์ญ ๋ณ์ ๋ฑ์ ์ฌ์ฉ๋๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด๋ค. LIFO(Last-In, First-Out) ๊ตฌ์กฐ๋ก ์๋ํ๋ฉฐ ๋งค์ฐ ๋น ๋ฅด์ง๋ง, ํ ๋น ์ฉ๋์ด ์ ํ๋์ด ์๋ค. ์ฌ๊ท ํธ์ถ์ด ๊น์ด์ง๊ฑฐ๋ ๋ฌดํ ๋ฃจํ์ ๋น ์ง๋ฉด
StackOverflowException
์ด ๋ฐ์ํ ์ ์๋ค. - ํ(Heap): new ์ฐ์ฐ์๋ก ์์ฑํ ๊ฐ์ฒด๋ ๋ฐฐ์ด ๋ฑ ๋์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ์ผ๋ก, ์๋์ ์ผ๋ก ์ ์ฐํ๊ณ ์ฉ๋์ด ํฌ๋ค. ํ์ง๋ง ์ฐธ์กฐ ๊ด๋ฆฌ๊ฐ ๋ณต์กํ๊ณ ๋์๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ๋ค.
Node.js๋ ๊ธฐ๋ณธ์ ์ผ๋ก
- 64๋นํธ ํ๊ฒฝ: ์ฝ 1.5GB
- 32๋นํธ ํ๊ฒฝ: ์ฝ 700MB
ํ ๋ฉ๋ชจ๋ฆฌ ์ ํ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, --max-old-space-size
์ต์
์ผ๋ก ํ ํฌ๊ธฐ๋ฅผ ์กฐ๊ธ ๋ ๋๋ฆด ์๋ ์์ง๋ง 12GB ์ด์์ ์์ ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ด๋ ต๋ค.
GC(Garbage Collector)์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ
GC(Garbage Collector)๋ ํ๋ก๊ทธ๋จ์ด ๋ช ์์ ์ผ๋ก ํด์ ํ์ง ์์ ๊ฐ์ฒด ์ค, ๋ ์ด์ ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ํ์ํด ์๋์ผ๋ก ํด์ ํ๋ ๊ธฐ๋ฅ์ด๋ค. GC๋ ํ ๋ฉ๋ชจ๋ฆฌ์์๋ง ๋์ํ๋ฉฐ, ์คํ ๋ฉ๋ชจ๋ฆฌ๋ ํจ์ ์ข ๋ฃ ์ ์์คํ ์ด ์๋ ํด์ ํ๋ค. GC๊ฐ ํ์ํ ์์ญ์ ๋์ ์ผ๋ก ํ ๋น๋ ๊ฐ์ฒด๋ค์ด ์ ์ฅ๋๋ ํ์ด๋ฉฐ, ์ฌ๊ธฐ์๋ง ์ฐธ์กฐ ์ฌ๋ถ๋ฅผ ํ๋จํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํ๋ค.
GC๋ ์ธ์ด๋ ๋ฐํ์์ด ์์ฒด์ ์ผ๋ก ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด๋ฉฐ, ๋ํ์ ์ผ๋ก JavaScript (V8), Java, C#, Python ๋ฑ์์ ๊ตฌํ๋์ด ์๋ค. ์ธ์ด๋ ํ๋ ์์ํฌ์ ๋ฐ๋ผ GC ๋ฐฉ์๊ณผ ์ ์ด ๊ฐ๋ฅ ๋ฒ์๋ ๋ฌ๋ผ์ง๋ค. ์๋ฅผ ๋ค์ด Node.js์ ๊ฒฝ์ฐ ๋ช
์์ ์ผ๋ก global.gc()
๋ฅผ ํธ์ถํ ์ ์์ง๋ง, ์ด๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์คํ ์ --expose-gc
์ต์
์ด ํ์ํ๋ค.
๋ํ์ ์ธ ๋ฐฉ์์ผ๋ก๋ ๋งํฌ-์ค-์ค์(Mark-and-Sweep) ์๊ณ ๋ฆฌ์ฆ์ด ์๋ค. GC๋ ์ ํด ์๊ฐ์ ์๋ํ๋ฉฐ, ๋ฃจํธ ๊ฐ์ฒด์์ ๋๋ฌํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐํ๋ค. ํ์ง๋ง, ์ฌ์ ํ ์ฐธ์กฐ๊ฐ ๋จ์ ์๋ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์ง ์์ ๋์(leak)๊ฐ ๋ฐ์ํ ์ ์๋ค.
ํ์ง๋ง GC๊ฐ ๋ชจ๋ ๊ฒ์ ์๋ฒฝํ๊ฒ ์ ๋ฆฌํด ์ค ๊ฒ์ด๋ผ ๋ฏฟ๊ณ ๋ฐฉ์ฌํ๋ฉด, ์์์น ๋ชปํ ๋ฉ๋ชจ๋ฆฌ ํญ์ฆ(Memory Spike)์ด ๋ฐ์ํ ์ ์๋ค. ์ด๋ ๋จ๊ธฐ๊ฐ์ ๊ธ๊ฒฉํ ๊ฐ์ฒด ์์ฑ ๋๋ ์ฐธ์กฐ ๋์ ์ผ๋ก ์ธํด ํ์ด ๊ธ๊ฒฉํ ํ์ฅ๋๋ ํ์์ผ๋ก, ์์คํ ์ด ๊ฐ์์ค๋ฝ๊ฒ ๋ถ์์ ํด์ง๋ ์์ธ์ด ๋๋ค.
๋ฌธ์ ์ ๋ฐ๋จ: ํ๊บผ๋ฒ์ ์ฒ๋ฆฌํ๋ ค๋ค OOM ๋ฐ์
ํ ๊ณต๊ฐ์ด ์ ํ๋์ด ์๋ค๋ ๊ฒ์ ๋๋ฌด ๋น์ฐํ ์ฌ์ค์ด๊ณ , ์ด๋ก ์์ผ๋ก๋ ์ ์๊ณ ์์๋ค. ๊ทธ๋ฐ๋ฐ ํ์์ ์ฝ๋๋ฅผ ์ง๋ฉด์ ๋ฐฐ์ด์ ๋ค๋ฃฐ ๋, ๊ทธ ๋ฐฐ์ด์ ๋ด๊ธฐ๋ ์ฉ๋์ ๋ํด ๊ณ ๋ฏผํ ์ผ์ด ๋ง์ง ์์๋ค. ๋ณ๋ช ํด ๋ณด์๋ฉด, ์ด๋ ๊ฒ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๊ฑด ๋์์ฒ์์ด์๋ค.
AWS S3 ๋ฒํท์์ ์ฝ์ด์จ ๊ฐ์ฒด๋ ์์ถ๋์ด ์์๊ณ , ์์ถ์ ํ๋ฉด ๊ทธ ์์๋ ์๋ฐฑ๋ง ๊ฐ์ JSON ๋ฐ์ดํฐ๊ฐ ๋ค์ด์์๋ค. ๋ด๊ฐ ํด์ผ ํ ์ผ์ ๊ฐ๊ฐ์ JSON ๋ฐ์ดํฐ๋ฅผ AWS DynamoDB์ ์ ๋ก๋ํ๋ ๊ฒ์ด์๋ค. ๋๋ ์ต๊ด์ ์ผ๋ก tasks ๋ฐฐ์ด์ ๋ง๋ค์ด์ ๋ณ๋ ฌ์ฒ๋ฆฌ๋ฅผ ํ๋ ค๊ณ ์๋ํ๋ค.
์ฒ์ ์์ฑํ ์คํฌ๋ฆฝํธ๋ ๋ค์๊ณผ ๊ฐ๋ค.
async function readS3AndProcess() {
// S3 ์ฝ์ด์ค๋ ๋ก์ง (์๋ต)
const tasks = [];
for await (const line of rl) {
if (line.trim()) {
try {
const data = JSON.parse(line);
tasks.push(data.Item);
} catch (err) {
logProcessing(Status.Error, `JSON parse error in line: ${line}`);
}
}
}
await processBatch(tasks);
}
async function processBatch(tasks) {
const promises = tasks.map(async (item) => {
try {
await processDocument(item);
} catch (err) {
logProcessing(Status.Error, `Process error: ${err.message}`);
}
});
await Promise.all(promises);
}
์ด ์ฝ๋๋ ๋ชจ๋ JSON ๋ฐ์ดํฐ๋ฅผ ํ๊บผ๋ฒ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ด๊ณ , ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ๊ฐ์๊ฐ ๋ง์์๋ก ํ์ ๋น ๋ฅด๊ฒ ์๋ชจํ๋ค. ๋น์ ์ฒ๋ฆฌ ๋์์ด์๋ JSON ๋ฌธ์์ ํฌ๊ธฐ๋ ์ฝ 0.5KB์ด์๊ณ , ์ด๋ก ์ ์ผ๋ก๋ ์๋ฐฑ๋ง ๊ฐ๋ฅผ ๋ด์ ์ ์์ ๊ฒ์ฒ๋ผ ๋ณด์๋ค. ํ์ง๋ง ์ค์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํจ์ฌ ์ปค์ ธ ์์๋ณด๋ค ํจ์ฌ ์ ์ ๊ฐ์๋ง ๋ด์๋ ํ๊ณ์ ๋๋ฌํ๋ค. OOM(Out of Memory)์ด ๋๋ ๊ฑด ์๊ฐ๋ฌธ์ ์๊ณ , ๊ฒฐ๊ตญ ๋ฐ์ํ๊ณ ๋ง์๋ค.
ํด๊ฒฐ์ฑ : ์ฒญํฌ ๋จ์ ๋ณ๋ ฌ ์ฒ๋ฆฌ
์ด๋ด ๋ ์ผ๋ฐ์ ์ผ๋ก ์๊ฐํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฒญํฌ ๋จ์ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ค. ๋จผ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ฉํ ํ, ์ผ์ ํฌ๊ธฐ ๋จ์๋ก ๋๋ ๋ณ๋ ฌ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด๋ค. ์ด ๋ฐฉ์์ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ๊ณ ์ฒ๋ฆฌ ์๋๋ ๋น ๋ฅด๋ค.
const chunkSize = 100;
for (let i = 0; i < data.length; i += chunkSize) {
const chunk = data.slice(i, i + chunkSize);
await Promise.allSettled(chunk.map(async (item) => {
const parsed = await parseAndProcess(item);
await saveToDatabase(parsed);
}));
}
ํ์ง๋ง ์ด๋ฒ ์์ ์์๋ S3์ ์ ์ฅ๋ gzip ์์ถ ํ์ผ์ stream์ผ๋ก ๋ผ์ธ ๋จ์๋ก ์ฝ์ด ๋ค์ด๋ ๋ฐฉ์์ด ํ์์ ์ด์๋ค. ์์ถ ํด์ ์ ๋ฐ์ดํฐ ํฌ๊ธฐ๊ฐ ์ GB ์ด์์ผ๋ก ์ฆ๊ฐํ ์ ์์ด, ์ ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ฉํ๋ฉด ๊ณง๋ฐ๋ก OOM ์๋ฌ๋ก ์ด์ด์ง ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
ํด๊ฒฐ์ฑ ๋ณด์: stream + ์ฒญํฌ ๋จ์ ์ฒ๋ฆฌ
์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด stream์ ์ฝ์ด ๋ค์ด๋ฉด์ ์ผ์ ๊ฐ์์ฉ ๋ฐฐ์ด์ ๋ชจ์ผ๊ณ , ์ฃผ๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ๋ฐฐ์ด์ ๋น์ฐ๋ ๋ฐฉ์์ผ๋ก ์์ ํ๋ค.
async function readS3AndProcess() {
// S3 ์ฝ์ด์ค๋ ๋ก์ง (์๋ต)
let tasks = [];
for await (const line of rl) {
if (line.trim()) {
try {
const data = JSON.parse(line);
tasks.push(data.Item);
if (tasks.length >= BATCH_SIZE) {
await processBatch(tableName, tasks);
tasks = []; // ๋ฐฐ์ด ์ด๊ธฐํ
}
} catch (err) {
logProcessing(Status.Error, `JSON parse error in line: ${line}`);
}
}
}
// ๋จ์ tasks ์ฒ๋ฆฌ
if (tasks.length > 0) {
await processBatch(tasks);
}
}
async function processBatch(tasks) {
const promises = tasks.map(async (item) => {
try {
await processDocument(item);
} catch (err) {
logProcessing(Status.Error, `Process error: ${err.message}`);
}
});
await Promise.allSettled(promises); // allSettled ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝ
}
์ด ์ฝ๋๋ stream์์ ์ผ์ ์๋์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด ์ฒญํฌ ๋จ์๋ก ๋ณ๋ ฌ ์ฒ๋ฆฌํ๊ณ , ๊ทธ ํ ์ฆ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋น์ฐ๋ ๋ฐฉ์์ผ๋ก ์ค๊ณ๋์ด ํ ๋ฉ๋ชจ๋ฆฌ ์ ์ ๋ฅผ ์ต์ํํ ์ ์์๋ค. ์ค์๊ฐ์ฑ๊ณผ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ฌ์ด์ ๊ท ํ์ ๊ณ ๋ คํ ์ค๊ณ์๋ค.
์ฐธ๊ณ ๋ก ์คํฌ๋ฆฝํธ๋ฅผ ์ต์ด ์์ฑํ๋ ์์ ์๋ Promise.all()
์ ์ฌ์ฉํ์ง๋ง, ์ดํ์๋ Promise.allSettled()
๋ก ๋ณ๊ฒฝํ๋ค. ์ด๋ ์ผ๋ถ ์์
์ด ์คํจํ๋๋ผ๋ ์ ์ฒด Promise ์ฒ๋ฆฌ๋ฅผ ๋ฉ์ถ์ง ์๋๋ก ํ๊ธฐ ์ํจ์ด๋ค.
์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
readline
์ ํตํด gzip stream์ ๋ผ์ธ ๋จ์๋ก ์ฝ๊ณ ,- ๊ฐ ์ค์ JSON์ผ๋ก ํ์ฑํ ๋ค, ์ผ์ ๊ฐ์์ฉ ์์ ๋ฐฐ์ด
tasks
์ ์ ์ฅํ๋ค. tasks.length
๊ฐBATCH_SIZE
์ ๋๋ฌํ๋ฉดprocessBatch()
๋ฅผ ํธ์ถํด ๋ณ๋ ฌ ์ฒ๋ฆฌํ๊ณ ๋ฐฐ์ด์ ์ด๊ธฐํํ๋ค.- stream์ ๋๊น์ง ์ฝ์ผ๋ฉฐ ์ด ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
- ๋ชจ๋ stream์ ์ฝ์ ํ, ๋ง์ง๋ง์ ๋จ์ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ํ ๋ฒ ๋ ์ฒ๋ฆฌํ๋ค.
๊ธฐํ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๋ ๋ฐฉ๋ฒ๋ค
๋๋ถ๋ถ์ ๊ณ ์์ค ์ธ์ด๋ค์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํด ์ค๋ค. ํ์ง๋ง ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ง๋ค ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ฐฉ๋ฒ๋ ์๋ค. ๋ง์ฝ ๊ด์ฌ์ด ์๋ค๋ฉด ์๋ ํค์๋๋ค์ ์ฐพ์๋ณด๋ ๊ฒ๋ ์ข๋ค.
- ๋ถํ์ํ ์ฐธ์กฐ ์ ๊ฑฐ: JS๋ C#์์ ๋ ์ด์ ์ฌ์ฉํ์ง ์๋ ๊ฐ์ฒด๋ = null ์ฒ๋ฆฌํ์ฌ GC ๋์์ด ๋๋๋ก ๋ง๋ ๋ค.
- (JS)
WeakRef
,FinalizationRegistry
์ฌ์ฉ : ์ฝํ ์ฐธ์กฐ ๋ฐ ๊ฐ์ฒด ์๋ฉธ ์ดํ ์ฝ๋ฐฑ ์ฒ๋ฆฌ ๊ฐ๋ฅ. - C#์ using ๋ฌธ๋ฒ: IDisposable์ ๋ช ์์ ์ผ๋ก ํด์ ํด ์ฃผ๋ ๋ฐฉ์์ผ๋ก, GC์ ์์กดํ์ง ์๋๋ก ํ๋ค.
using (var stream = new FileStream(path, FileMode.Open))
{
// ํ์ผ ์ฒ๋ฆฌ
}
- GC ๊ฐ์ ํธ์ถ(๊ถ์ฅ๋์ง ์์)
- Node.js:
global.gc()
(๋จ,--expose-gc
์ต์ ํ์) - .NET:
GC.Collect()
- Node.js:
๋จ, GC๋ฅผ ๊ฐ์ ๋ก ํธ์ถํ๋ ํ์๋ ์ฑ๋ฅ์ ์ ์ํฅ์ ์ค ์ ์์ผ๋ฏ๋ก ๊ฐ๊ธ์ ํผํ๋ ๊ฒ์ด ์ข๋ค.
์์ ์คํฌ๋ฆฝํธ์๋ ๋ฉ๋ชจ๋ฆฌ ์ฒ ํ์ด ํ์ํ๋ค
๋ก์ปฌ์์ ์คํํ๋ ์คํฌ๋ฆฝํธ๋ ์๊ณ ๋จ์ํด ๋ณด์ด์ง๋ง, ๊ฒฐ๊ตญ ๋ฉ๋ชจ๋ฆฌ๋ผ๋ ์ ํํ ์์ ์์์ ๋์๊ฐ๋ ํ๋์ ํ๋ก์ธ์ค๋ค. ๊ฐ๋ฐ์๋ค์ ์๊ณ ๋ฆฌ์ฆ, ํจํด, ๊ตฌ์กฐ์๋ง ์ง์คํ์ง๋ง, ์ค์ ๋ก ์ค๋ฌด์์ ๋ฒ์ด์ง๋ ๋๋ถ๋ถ์ ๋ฌธ์ ๋ ํ๊ฒฝ์ ์ ์ฝ, ํนํ ๋ฉ๋ชจ๋ฆฌ ์ค๊ณ ์คํจ์์ ๋น๋กฏ๋๊ณค ํ๋ค.
์์ ๋ถ์ฃผ์ ํ๋๊ฐ ์๊ธฐ์น ์์ OutOfMemoryException
์ผ๋ก ์ด์ด์ง ์ ์๊ณ , ์๋ชป๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ ์ฒด ์์
์ ์คํจ๋ก ์ง๊ฒฐ๋๋ค. ์ด๋ฒ ๊ฒฝํ์ ํตํด ๋จ์ํ ๋ฐ๋ณต ์์
์ด๋ผ๋ ๋ฉ๋ชจ๋ฆฌ ํ๋ฆ์ ์ค๊ณํ๊ณ , ๋ฐ์ดํฐ์๊ณผ ๊ตฌ์กฐ๋ฅผ ์์ธกํ๋ฉฐ ์คํ ํ๊ฒฝ์ ๋ง๊ฒ ๋ฆฌ์คํฌ๋ฅผ ์ต์ํํ๋ ์ต๊ด์ด ํ์์์ ๊นจ๋ฌ์๋ค.
๊ฐ๋ฐ์๋ ๋น ๋ฅธ ์ฝ๋๋ฟ ์๋๋ผ, ํ์ฅ์ฑ์ด ์๊ณ ์ค๋ ์ฌ์ฉํ ์ ์๋ ์ฝ๋๋ฅผ ์จ์ผ ํ๋ค. ๊ทธ ์ฒซ๊ฑธ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ํ๋ ๊ฒ์์ ์์ํ๋ค. ๋จ์ํด ๋ณด์ด๋ ์คํฌ๋ฆฝํธ๋ผ๋, ํ๋ก๋์ ์์ค์ผ๋ก ๊ณ ๋ฏผํ๋ ๊ณผ์ ์์ ์ฑ์ฅ์ ๊ธฐํ๋ฅผ ์ป์ ์ ์๋ค.