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#
내 답안 · 자동 저장

작성 후 위 해설 보기에서 모범 해설과 대조하세요.