JAVA
Java 언어·JVM·생태계 학습 기록. 하위 폴더는 주제별 세부 정리.
[초안] Java 동시성 락 정리 — 커머스 메뉴/프로모션 정책 캐시 갱신 관점
커머스 백엔드에서 메뉴, 프로모션, 매장 운영 정책 같은 "거의 안 바뀌지만 모든 요청이 읽는" 데이터는 거의 예외 없이 메모리 캐시로 들어간다. 트래픽이 큰 시간대에 이 캐시를 어떻게 갱신할지가 곧 시스템의 안정성을 결정한다. 갱신 순간에 락을 잘못 잡으면 모든 조회 스레드가 멈추고, 락을 너무 느슨하게 풀면 절반은 옛 데이터, 절반은 새 데이터를 보는...
[초안] JVM 튜닝 실전: 메모리 구조부터 Virtual Threads, GC 튜닝, 프로파일링까지
시니어 Java 백엔드 엔지니어라면 "서비스가 느려졌다"는 장애 리포트를 한 번쯤 받아봤을 것이다. 이때 "GC가 원인인가?"를 10분 안에 판단할 수 있는가, 아니면 로그만 뒤적이다가 한 시간을 보내는가. 이 차이가 시니어와 미드 레벨의 결정적 차이다. JVM 튜닝은 "옵션 플래그를 외우는 것"이 아니다. 힙이 어떻게 구성되는지, GC가 어떤 규칙으로 객...
Java StampedLock — 읽기 폭주에도 쓰기가 밀리지 않는 락
--- ReentrantReadWriteLock(RRWL)은 읽기 많고 쓰기 드문 상황에 흔히 쓰는 도구다. 읽기 락은 동시에 여러 스레드가 잡을 수 있고, 쓰기 락은 모든 읽기가 끝날 때까지 기다린다. 문제는 읽기가 계속 들어오면 쓰기가 영원히 기다릴 수 있다는 점이다. RRWL write lock 대기 타임라인: [읽기1 실행 중........] [읽기...
Java의 로깅 환경
- 자바 로깅은 API <-> 구현체 <> 수집/분석 시스템으로 나뉜다고 보면 됨 text 코드 -> 로깅 API -> 로깅 구현체 -> 로그 저장/분석 서비스 - slf4j (사실상 표준) - 역할: java log.info("orderId = {}", orderId); - 같은 공통 인터페이스 제공 - 장점 - 구현체 교체 가능...
MDC (Mapped Diagnostic Context)
- 현재 실행 흐름(Thread)에 key-value 형태의 컨텍스트를 붙여두는 공간 java MDC.put("traceId", "abc-123"); log.info("주문 생성"); // [traceId=abc-123] 주문 생성 - 로그를 찍을 때마다 매번 traceId를 파라미터로 넘기지 않아도 됨 - Logback / Log4j / SLF4J에서 공...
Virtual Thread와 Project Loom
- OpenJDK에서 자바의 동시성 모델을 근본적으로 바꾸자는 목표로 시작 - 기존 OS 스레드 기반 모델의 한계 - 스레드 생성 비용 큼 (1MB stack) - context switching 무거움 - 수십만 단위 concurrency 불가 - 목표 - Lightweight user-mode thread (Fiber / Virtual T...