14. .NET GC 세대·LOH·Server vs Workstation GC
난이도 상 해설 보기 →
결함을 모두 찾고 원인·수정안·더 나은 설계를 제시하라. 마커
(A)(B) 는 주목 위치 힌트다.
결함 코드 · C#
// ─────────────────────────────────────────────────────────────
// 주제: .NET GC 세대(generational GC)·대형 객체 힙(LOH)·Server vs Workstation GC
//
// 게임 서버는 틱마다 짧은 수명의 작은 객체(이벤트/임시 버퍼)를 대량으로 만들고,
// 가끔 큰 배열(스냅샷/맵 청크)을 할당한다. 아래 코드의 동작을 실행 전에 예측하라.
//
// 과제:
// 1) 표시된 (1)~(4)의 출력값을 예측하라.
// 2) byte[100_000] 이 작은 객체와 "다른 힙"에 가는 경계(바이트 수)는 무엇이며,
// 그 힙이 어느 세대로 취급되는지, 왜 그렇게 설계됐는지 설명하라.
// 3) 짧은 수명의 작은 객체를 매 틱 대량 생성하면 GC에 어떤 부담이 되는지,
// Workstation GC 와 Server GC, 그리고 백그라운드 GC 가 이를 어떻게 다루는지 설명하라.
// (내부 동작 설명은 answer.md 에서. 여기서는 예측만.)
// ─────────────────────────────────────────────────────────────
using System;
class Program
{
static void Main()
{
var small = new byte[100]; // 작은 객체
var large = new byte[100_000]; // 큰 배열
Console.WriteLine(GC.GetGeneration(small)); // (1)
Console.WriteLine(GC.GetGeneration(large)); // (2)
int g0 = GC.CollectionCount(0);
for (int i = 0; i < 1_000_000; i++)
{
var tmp = new byte[16]; // 매번 버려지는 짧은 수명 객체
_ = tmp;
}
Console.WriteLine(GC.CollectionCount(0) > g0); // (3)
GC.Collect(); // 전체 수집(gen2까지)
Console.WriteLine(GC.GetGeneration(small)); // (4)
}
} 내 리뷰 · C#
내 답안 · 자동 저장
작성 후 위 해설 보기에서 모범 해설과 대조하세요.