자바 언어·플랫폼 용어 사전
학습노트에서 용어를 누르면 여기로 옵니다. 각 용어의 동작 원리·JVM 내부·실무 함정을 정리했습니다.
53개 용어 · 상세 정리 53개
언어 기초6
- 원시 타입·참조 타입primitive · reference · 스택과 힙
값을 직접 담느냐 주소를 담느냐의 차이. 대입·비교·null 가능 여부가 전부 여기서 갈린다.
- 오토박싱autoboxing · 언박싱 · Integer 캐시
원시 타입과 래퍼를 자동 변환하는 기능. 캐시 범위와 null 언박싱이라는 두 함정이 숨어 있다.
- equals·hashCode동일성 · 동등성 · hashCode 규약 · hashCode · equals
==는 주소를, equals는 논리적 같음을 본다. 둘을 함께 재정의하지 않으면 해시 컬렉션이 조용히 깨진다.
- 불변 객체immutability · 방어적 복사
생성 후 상태가 바뀌지 않는 객체. 그 자체로 스레드 안전하고 해시 키·캐시로 안전하다.
- finaleffectively final
붙는 자리마다 뜻이 다르다. 그리고 '참조가 안 바뀐다' 이지 '객체가 안 바뀐다' 가 아니다.
- enum열거형
상수 묶음이 아니라 인스턴스가 고정된 클래스다. 그 성질이 싱글톤 보장까지 준다.
제네릭2
동시성5
- 가시성·volatilevisibility · happens-before · JMM · 메모리 배리어
한 스레드의 변경이 다른 스레드에 보이는가의 문제. volatile은 가시성과 순서를 보장하지만 원자성은 아니다.
- 락synchronized · ReentrantLock · 데드락
임계 구역을 한 번에 하나만 지나가게 하는 장치. synchronized는 자동 해제, ReentrantLock은 기능이 많다.
- CASCompare-And-Swap · AtomicInteger · LongAdder · ABA 문제
예상값과 같을 때만 바꾸는 원자적 CPU 명령. 락 없이 동시성을 얻지만 고경합에서는 오히려 손해다.
- ExecutorExecutorService · 스레드 풀 · CompletableFuture
스레드를 직접 만들지 않고 작업을 제출하는 방식. 풀 크기와 거부 정책이 안정성을 좌우한다.
- 가상 스레드Virtual Thread · Loom · pinning · JEP 491
블로킹 시 OS 스레드를 놓아 주는 JVM 관리 스레드. 블로킹 코드 그대로 수만 동시성을 얻는다.
함수형3
컬렉션8
- 컬렉션 선택ArrayList · LinkedList · HashMap · fail-fast
메모리 배치와 접근 패턴으로 고른다. 대부분 ArrayList와 HashMap이 정답이다.
- ConcurrentHashMapCHM · computeIfAbsent · 동시성 컬렉션
락 분할과 CAS로 동시 접근을 처리하는 맵. 원자 연산의 조합은 여전히 원자적이지 않다.
- 불변 컬렉션List.of · unmodifiableList · Collections.unmodifiable · 방어적 복사본
"못 바꾼다"에는 세 단계가 있다 — 뷰, 진짜 불변, 그리고 깊은 불변.
- 가변 키
해시 컬렉션에 넣은 뒤 equals·hashCode에 쓰이는 필드가 바뀌는 키. 원소가 컬렉션 안에 남은 채 검색·삭제가 안 되는 상태가 된다.
- subList
원본 리스트의 일부를 들여다보는 뷰. 복사본이 아니라서 양쪽 수정이 서로 보이고, 원본이 구조적으로 바뀌면 예외가 난다.
- 오버로드 해석오버로드
어떤 오버로드를 부를지 컴파일 시점에 정적 타입으로 결정하는 과정. List.remove(int)와 remove(Object)의 고전적 함정이 여기서 나온다.
- 배열의 equals·hashCodeArrays.hashCode · Arrays.equals
배열은 equals·hashCode를 재정의하지 않아 주소로 비교된다. 내용 비교는 Arrays.equals·Arrays.hashCode를 써야 한다.
- Integer 캐시Integer.valueOf
Integer.valueOf가 −128~127 값을 미리 만들어 재사용하는 것. 이 구간에서만 ==가 우연히 맞아 참조 비교 버그를 감춘다.
JVM7
- 클래스 로딩클래스로더 · 위임 모델 · static 초기화
클래스 파일을 읽어 메모리에 올리는 과정. 로딩-링크-초기화 세 단계이며 초기화는 첫 사용까지 미뤄진다.
- JVM 메모리 구조힙 · 스택 · 메타스페이스 · 런타임 데이터 영역
스레드가 공유하는 힙·메타스페이스와 스레드마다 갖는 스택·PC로 나뉜다. OOM 메시지가 어디를 가리키는지 알려 준다.
- 바이트코드class 파일 · javap · 스택 기반 VM · 상수 풀
javac가 만드는 중간 표현. 스택 기반 명령어라 어떤 CPU에서도 같은 의미로 해석된다.
- 메서드 디스패치invokevirtual · invokestatic · invokeinterface · vtable · 동적 바인딩
어떤 메서드 구현을 실제로 부를지 정하는 절차. 정적 바인딩과 동적 바인딩이 갈린다.
- 객체 헤더object header · mark word · klass pointer · 객체 정렬
모든 객체가 데이터 앞에 다는 관리 정보. 해시·락·GC 나이가 여기 들어간다.
- 리플렉션reflection · Class.forName · setAccessible
실행 중에 이름만으로 클래스를 찾아 쓰는 기능. 프레임워크가 우리 코드를 다루는 원리다.
- 동적 프록시java.lang.reflect.Proxy · InvocationHandler · CGLIB · $Proxy0
인터페이스만 주면 그 구현체를 실행 중에 만들어 낸다. method.invoke 앞뒤에 코드를 넣는 것이 전부다.
GC·JIT5
- GC도달성 · 가비지 컬렉션 · Stop-The-World · 세대 구분
루트에서 도달할 수 없는 객체를 회수하는 것. 참조 개수가 아니라 도달성으로 판단한다.
- JITJust-In-Time · C1 · C2 · 역최적화
자주 실행되는 코드를 기계어로 번역하는 컴파일러. 그래서 자바는 워밍업 후에 빨라진다.
- TLABThread-Local Allocation Buffer · 포인터 범프 · 할당 속도
스레드마다 잘라 주는 힙 조각. 객체 할당이 포인터 하나 증가로 끝나는 이유.
- 세대별 GC약한 세대 가설 · Young GC · Old GC · Eden · Survivor · 카드 테이블
"대부분의 객체는 금방 죽는다"는 가설 위에 세운 분할 수집 전략.
- ZGCG1 · Shenandoah · Region · 동시 수집기 · 컬러 포인터
정지 시간을 힙 크기와 무관하게 유지하는 동시 수집기. G1과의 선택 기준.
모던 자바5
- recordsealed · 패턴 매칭 · switch 식
값 객체의 보일러플레이트를 없애는 타입. sealed·패턴 매칭과 짝을 이뤄 대수적 데이터 타입을 만든다.
- AOT 캐시Project Leyden · Compact Object Headers · LTS
로드·링크된 클래스와 메서드 프로파일을 파일로 저장해 기동을 줄이는 기능. 코드 변경이 필요 없다.
- JPMS모듈 시스템 · module-info · requires · exports · 클래스패스 지옥
Java 9의 모듈 시스템. 패키지 단위 공개 범위와 의존을 컴파일 타임에 선언한다.
- 구조적 동시성Structured Concurrency · StructuredTaskScope · Scoped Value · JEP 506
여러 작업의 수명을 코드 블록에 묶는 모델. 누수와 취소 누락을 구조로 막는다.
- Lazy ConstantsLazyConstant · StableValue · Stable Values
스레드 안전한 지연 초기화를 언어가 대신 해 준다. 25의 StableValue가 26에서 이름·API가 바뀌었다.
실무 사례10
- 이중 검사 잠금DCL · Double-Checked Locking · 홀더 패턴
락 비용을 줄이려는 지연 초기화 패턴. volatile 없이 쓰면 재정렬 때문에 조용히 깨진다.
- 거짓 공유False Sharing · 캐시 라인 · @Contended
서로 다른 변수가 같은 캐시 라인에 있어 코어끼리 무의미하게 경합하는 현상. 락이 없는데도 느려진다.
- Log4ShellCVE-2021-44228 · JNDI 인젝션 · 로그 인젝션
로그 문자열 안의 ${jndi:...}가 원격 클래스를 불러와 실행된 취약점. 신뢰 경계의 교과서 사례.
- 역직렬화 취약점deserialization · 가젯 체인 · readObject · Serializable
신뢰할 수 없는 바이트를 객체로 되살리면 클래스패스의 코드가 연쇄 실행될 수 있다.
- 캐시 스탬피드thundering herd · cache stampede · 확률적 조기 만료 · 싱글플라이트
캐시가 동시에 만료되며 요청이 한꺼번에 원본으로 몰리는 현상. 캐시가 DB를 죽인다.
- ReDoS파국적 백트래킹 · catastrophic backtracking · 정규식 폭발
정규식 백트래킹이 지수적으로 폭발해 CPU를 태우는 취약점. Cloudflare 글로벌 장애의 원인.
- 커넥션 풀 사이징HikariCP · 풀 크기 · 리틀의 법칙 · 큐 대기
풀을 키우면 더 느려질 수 있다. 병목은 커넥션이 아니라 DB의 실제 동시 처리 능력이다.
- 오프힙 누수DirectByteBuffer · MaxDirectMemorySize · NMT · 네이티브 메모리
힙은 멀쩡한데 프로세스 메모리가 계속 는다. 힙 밖 영역이 원인인 경우.
- 거대 객체Humongous · G1 Region · 큰 배열 할당
G1에서 Region 절반을 넘는 객체는 특별 취급된다. 빈 공간이 많아도 OOM이 난다.
- 네이티브 스레드 OOMunable to create new native thread · 스레드 누수 · 스레드 스택
힙이 아니라 스레드를 더 못 만들어 나는 OOM. 스레드 스택과 OS 한도가 원인이다.