JVM(Java Virtual Machine)의 심층 이해
자바 애플리케이션의 성능과 안정성을 좌우하는 핵심은 JVM에 대한 깊은 이해입니다. 단순히 코드를 작성하는 것을 넘어, 코드가 메모리상에서 어떻게 동작하는지 파악하는 것이 중요합니다.
JVM 내부 구조와 런타임 데이터 영역
JVM은 클래스 로더, 실행 엔진, 그리고 데이터를 저장하는 런타임 데이터 영역으로 구성됩니다. 주요 메모리 영역은 다음과 같습니다.
- Heap: 모든 객체와 배열이 할당되는 공간으로, 가비지 컬렉션(GC)의 주요 대상입니다.
- Stack: 스레드마다 독립적으로 생성되며, 메서드 호출 시 프레임이 생성되어 지역 변수와 중간 계산 결과를 저장합니다.
- Method Area: 클래스 수준의 정보(필드, 메서드 데이터, 상수 풀)가 저장되는 공유 공간입니다.
- PC Register: 현재 실행 중인 JVM 명령의 주소를 보관합니다.
클래스 로딩 프로세스
클래스 파일(.class)이 JVM에 로드되는 과정은 Loading -> Linking (Verification, Preparation, Resolution) -> Initialization 단계를 거칩니다. 자바는 위임 모델(Delegation Model)을 사용하여 클래스를 로드하며, 상위 로더에게 우선권을 부여하여 중복 로딩과 보안 문제를 방지합니다.
메모리 관리와 가비지 컬렉션(GC) 알고리즘
효율적인 메모리 관리를 위해 GC는 힙을 Young Generation과 Old Generation으로 나누어 관리합니다.
- Mark-Sweep: 사용하지 않는 객체를 식별(Mark)하고 제거(Sweep)합니다.
- Mark-Compact: 제거 후 파편화된 메모리를 정리하여 연속된 공간을 확보합니다.
- Copying: 메모리 영역을 둘로 나누어 살아남은 객체만 다른 쪽으로 복사하며 정리합니다.
- G1 GC / ZGC: 최신 JVM에서는 지역(Region) 개념을 도입하여 정지 시간(STW)을 최소화합니다.
고급 멀티스레딩 및 병행성 제어
대규모 트래픽을 처리하는 서버 환경에서는 스레드 안전성(Thread-Safety) 확보가 필수적입니다.
스레드 풀(Thread Pool) 활용
무분별한 스레드 생성은 리소스 고갈을 초래하므로 ThreadPoolExecutor를 통해 스레드를 재사용해야 합니다.
동기화 메커니즘
전통적인 synchronized 외에도 자바는 더욱 세밀한 제어를 위한 도구를 제공합니다.
ReentrantLock: 명시적인 락 획득과 해제가 가능하며 공정성(Fairness)을 설정할 수 있습니다.ReadWriteLock: 읽기 작업이 많은 경우 성능을 최적화하기 위해 읽기용 락과 쓰기용 락을 분리합니다.CAS(Compare-And-Swap):AtomicInteger등에서 사용되는 논블로킹 알고리즘으로 성능 저하를 최소화합니다.
병행 컬렉션(Concurrent Collections)
멀티스레드 환경에서는 HashMap 대신 ConcurrentHashMap을, ArrayList 대신 CopyOnWriteArrayList를 사용하여 데이터 일관성을 유지합니다.
자바 심화 기능 및 최적화
리플렉션(Reflection)
런타임에 클래스의 구조를 분석하고 조작할 수 있는 기능입니다. 프레임워크 개발에 주로 사용됩니다.
Class<?> targetClass = Class.forName("com.app.core.InternalTask");
Object taskInstance = targetClass.getDeclaredConstructor().newInstance();
Method executeMethod = targetClass.getDeclaredMethod("process");
executeMethod.invoke(taskInstance);
Lambda 및 Stream API
함수형 프로그래밍 스타일을 도입하여 컬렉션 처리를 간결하고 효율적으로 수행합니다.
List<String> names = Arrays.asList("James", "Alice", "Bob", "John");
List<String> filtered = names.stream()
.filter(n -> n.startsWith("J"))
.map(String::toUpperCase)
.collect(Collectors.toList());
디자인 패턴의 실전 적용
싱글톤 패턴(Singleton)
지연 초기화와 멀티스레드 안전성을 보장하는 Bill Pugh Singleton 방식입니다.
public class AppConfig {
private AppConfig() {}
private static class Holder {
private static final AppConfig INSTANCE = new AppConfig();
}
public static AppConfig getInstance() {
return Holder.INSTANCE;
}
}
전략 패턴(Strategy Pattern)
실행 시점에 알고리즘을 선택하여 유연성을 높입니다.
public interface PaymentStrategy {
void pay(int amount);
}
public class CreditCardStrategy implements PaymentStrategy {
public void pay(int amount) {
System.out.println("Paid by Credit Card: " + amount);
}
}
public class PaymentContext {
private PaymentStrategy strategy;
public void setStrategy(PaymentStrategy strategy) {
this.strategy = strategy;
}
public void executePayment(int amount) {
strategy.pay(amount);
}
}
Spring 프레임워크 핵심 아키텍처
IoC(Inversion of Control) 및 DI(Dependency Injection)
객체의 생명주기 관리를 컨테이너에 위임하여 결합도를 낮추고 테스트 용이성을 확보합니다.
AOP(Aspect-Oriented Programming)
로그 처리, 트랜잭션 관리와 같은 공통 관심 사항을 비즈니스 로직에서 분리합니다.
@Aspect
@Component
public class PerformanceAspect {
@Around("execution(* com.app.service.*.*(..))")
public Object traceTime(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
try {
return joinPoint.proceed();
} finally {
long finish = System.currentTimeMillis();
System.out.println("Execution Time: " + (finish - start) + "ms");
}
}
}
마이크로서비스 아키텍처(MSA)와 Spring Cloud
분산 시스템 환경에서 안정적인 서비스를 운영하기 위한 핵심 요소들입니다.
- Eureka: 서비스 인스턴스의 위치를 동적으로 관리하는 서비스 디스커버리.
- API Gateway (Zuul/Spring Cloud Gateway): 통합 진입점 역할을 하며 인증, 라우팅을 담당.
- Resilience4j (Circuit Breaker): 특정 서비스 장애가 전체 시스템으로 전파되는 것을 방지.
- Config Server: 중앙 집중식 설정 관리를 지원.
핵심 면접 질문 체크리스트
JVM & 메모리
- JVM의 메모리 구조와 각 영역의 역할을 설명하세요.
- Java 8 이후 Method Area의 변화(Metaspace)에 대해 알고 있나요?
- GC의 동작 과정과 대표적인 GC 알고리즘의 차이를 설명하세요.
동시성 및 최적화
volatile키워드의 역할과 메모리 가시성에 대해 설명하세요.ThreadLocal의 사용 목적과 주의해야 할 메모리 누수 문제는 무엇인가요?- 자바에서 메모리 누수가 발생하는 대표적인 사례를 설명하세요.
프레임워크 및 설계
- Spring Bean의 생명주기를 단계별로 설명하세요.
- 프록시 패턴이 Spring AOP에서 어떻게 활용되는지 설명하세요.
- MSA 환경에서 서비스 간 트랜잭션 일관성을 유지하는 전략(Saga 패턴 등)은 무엇인가요?