TL;DR — 제출의 테스트케이스마다 새 JVM 프로세스를 띄우던 Java 채점 워커를, 단일 JVM이 전체 케이스를 순차 실행(Multi-Runner)하도록 바꾸고 CDS 아카이브·GraalVM 베이스로 보강했다. 운영 DB 기준 테스트케이스당 평균 실행 시간이 0.844s → 0.060s(약 14배), ≥1.0s 꼬리(JVM 콜드 스타트)가 완전히 사라졌다.

배경

문제 (증상)

원인 분석

해결 (방향별)

Phase 1 — CDS 아카이브로 클래스 로딩 단축 (docker/java/Dockerfile)

# 빌드 시 표준 클래스 메타데이터를 미리 덤프
RUN java -XX:+UseSerialGC -Xshare:dump \
    -XX:SharedArchiveFile=/app/classes.jsa 2>/dev/null; exit 0

Phase 2 — Single JVM Multi-Runner (핵심)

// 이전: 케이스마다 ProcessBuilder("java", ...) 를 ThreadPool로 병렬 기동
// 이후: 단일 러너 프로세스 1회 기동
Process runner = new ProcessBuilder(
    "java", "-XX:SharedArchiveFile=/app/classes.jsa", "-XX:+UseSerialGC",
    "-cp", workDir + ":/app", "TestCaseRunner", ...).start();