Java 36
- NIO와 이벤트 루프 - 셀렉터, 다이렉트 버퍼, Netty가 대신 해주는 일
- 클래스 로딩과 기동 시간 - 리플렉션의 비용과 AOT가 바꾸는 것
- 직접 만든 마이크로벤치마크는 얼마나 틀리는가 - 결함 넷을 하나씩 재봤다
- JIT 컴파일 - 계층 컴파일, 인라이닝, 역최적화
- CPU 프로파일러가 1순위로 지목한 코드를 고쳤더니 아무 일도 없었다
- 가상 스레드를 켜서 37배 느려진 엔드포인트 - 핀닝과 상한 없는 admission을 재다
- G1과 ZGC가 p99에 남기는 차이 - 300배 짧은 pause가 꼬리의 11%를 가져갔다
- GC 알고리즘 비교 - G1, ZGC, Shenandoah가 각자 무엇을 포기하는가
- 가상 스레드의 내부 - 스케줄러와 캐리어, 핀닝, 그리고 쓰지 않아야 할 때
- 동시성 도구의 비용 - synchronized, ReentrantLock, CAS가 경쟁에서 갈리는 지점
- 자바 메모리 모델 - happens-before, volatile, 그리고 final의 안전 공개
- Evolution of Java: Version-by-Version Breakdown
- Inside ArrayList: Capacity Expansion Mechanism
- Java의 Garbage Collection을 어떻게 이해해야 할까
- Java에서 static은 무엇을 의미하는가
- equals()와 hashCode()를 함께 오버라이드해야 하는 이유
- Java 진화의 두 축 JEP vs JSR
- Jakarta EE 기업용 Java의 진화
- Java 21 Features
- Integer.toString(int) vs String.valueOf(int) vs "" + int
- JMX와 MBean, 그리고 Micrometer가 지표를 얻는 길 - MBean이 없으면 지표는 0이 아니라 없다
- 세마포어와 permit - 동시에 몇 개까지 들일지를 세는 도구, 그리고 벌크헤드
- thread dump 읽는 법 - 스레드 상태와 스택 프레임, 그리고 RUNNABLE이 CPU를 쓴다는 뜻이 아닌 이유
- Lock-Free와 CAS - 락 없이 공유 변수를 바꾸는 방법과 그 한계
- 다이렉트 메모리와 Cleaner - 힙 밖의 버퍼는 누가 언제 해제하는가
- Statement와 PreparedStatement는 무엇이 다른가
- JVM은 무엇을 하는가
- Java에서 this와 super는 언제 어떻게 써야 하는가
- 객체, 클래스, 인스턴스는 어떻게 구분해야 하는가
- 상속과 다형성은 어떻게 연결되는가
- Java에서 객체 비교를 어떻게 해야 하는가
- 단일, 이중, 환형 연결 리스트는 어떻게 다른가
- LinkedList로 Queue를 구현할 때 핵심은 무엇인가
- LinkedList로 Deque를 구현할 때 알아야 할 것
- 배열과 연결 리스트는 언제 차이가 커지는가
- Java에서 배열과 리스트를 어떻게 구분해야 하는가