본문 바로가기

분류 전체보기142

메서드 영역의 GC와 Hibernate의 프록시 생성 로직에 관하여 자바 명세에서 GC가 메서드 영역을 청소해야한다고 되어있지는 않다. 일부 GC 구현체는 메서드 영역을 청소하지 않는다.비용 효율의 문제다 힙 메모리의 뉴제네레이션의 회수율은 GC한번으로 메모리공간의 70 ~ 99%를 회수한다.반면 메서드 영역은 회수 조건이 까다로워서 효율이 낮다. 그러나 많은 GC 구현체들은 메서드 영역을 청소한다.크게 두 가지를 회수한다. 바로 더 이상 쓰이지 않는 상수와 클래스다. 1. 상수문자열 상수풀에 "hello"가 있으나 시스템에서 "hello"인 문자열이 하나도 없다. 즉 상수 풀 안의 "hello" 상수를 참조하는 문자열 객체가 전혀 없고 리터럴을 사용하는 코드가 한 곳도 없으면 회수가 일어난다. 참고 : 문자열 상수풀은 현재 힙에 위치한다. 그러나 이것을 관리하는 문자열.. 2026. 5. 15.
JVM의 객체 생성 과정 자바 컴파일러는 new 키워드를 발견하면 두 개의 바이트 코드 명령어로 변환한다. 1. new2. invokespecial new는 JVM 관점에서 객체를 생성한다 (메모리 할당)invokespecial은 자바 관점에서 객체를 생성한다 (생성자 실행) 1. new1.1 확인new 명령의 매개변수가 런타임 상수 풀의 클래스를 가리키는 심벌참조인지 확인한다.즉, 메타스페이스에 있는 클래스정보를 가리키는지 확인한다.그 다음 해당 클래스가 로딩, 해석, 초기화 되었는지 확인한다.그 다음 새 객체를 담을 메모리를 할당한다. 1.2 메모리 할당메모리 할당 방식에는 두가지가 존재하며 어떤 방식을 택하는지는 가비지 컬렉터의 종류에 따라 다르다.1. 포인터 밀치기 방식2. 프리리스트 방식 포인터 밀치기 방식은 자바 힙이.. 2026. 5. 15.
I/O 멀티플렉싱 - 엣지 트리거, 레벨 트리거 레벨 트리거와 엣지 트리거가 있다.레벨 트리거는 입력버퍼에 데이터가 있으면 계속 알려준다.1000 -> 500 -> 100 -> 100500이 될때도 알려주고100이 될때도 알려주고 100이 유지될때도 알려준다 반면 엣지 트리거는 입력버퍼로 데이터가 수신된 상황에서 딱 한번만 이벤트가 등록된다. 데이터가 남아있다고 추가로 이벤트가 등록되지는 않는다. select 모델은 레벨 트리거로 동작한다. 엣지 트리거는 반드시 논블로킹으로 동작해야한다.엣지 트리거의 특성상 블로킹 방식으로 동작하는 리드앤 라이트 함수의 호출을 서버를 오랜시간 멈추게 할 수 있다.왜냐하면 소켓 입력버퍼에 데이터가 없으면 계속 블로킹이 되기 때문이다.따라서 사전에 오류 확인 과정도 필요하다. 입력버퍼가 비어있는지 미리 확인해야한다. re.. 2026. 5. 5.
I/O 멀티플렉싱 - epoll SELECT는1. 애플리케이션은 요청이 들어오면 시스템 콜을 통해 OS에 소켓을 만듬 커널은 FD 반환2. 애플리케이션은 FD배열 비트맵을 가지고 있음3. select()를 통해 커널에게 이 배열을 감시해달라고 부탁4. 이벤트가 발생하고 커널은 select()의 응답을 반환5. 애플리케이션은 다시 FD배열 비트맵으로 select()를 실행 select 방식의 단점 : select를 호출할 때마다 관찰대상에 대한 정보를 매번 운영체제에게 전달해야한다. epoll은1. 상태 변화 확인을 위한 전체 파일 디스크립터 대상 반복문이 없다.2. select에 대응하는 epoll_wait 함수 호출 시, 관찰 대상의 정보를 매번 전달할 필요가 없다. select에서는 애플리케이션이 FD배열 비트맵을 만들었지만 epo.. 2026. 5. 5.
I/O 멀티플렉싱 - select 멀티플렉싱 : 하나의 통신채널을 통해 둘 이상의 데이터를 전송하는데 사용되는 기술 select로 구현하는 방법 한 곳에 여러 파일 디스크립터를 모아두고 동시에 이들을 관찰할 수 있다수신한 데이터를 지니고 있는 소켓이 존재하는가?블로킹 되지 않고 데이터의 전송이 가능한 소켓은 무엇인가?예외상황이 발생한 소켓은 무엇인가?이 각각의 관찰항목을 이벤트라고 한다. 그리고 해당 상황이 발생하면 이벤트가 발생했다고 한다. 먼저 관찰하고자하는 파일 디스크립터를 모아야한다.모을때도 세 묶음으로 모아야한다 (수신, 전송, 예외) fd_set이라고 불리는 배열이 있다 0,1로만 이루어지는 비트단위 배열이다1이면 관찰의 대상임을 뜻함 FD_ZERO 인자로 전달된 주소의 모든 비트를 0으로 초기화FD_SET 특정 주소의 변수.. 2026. 5. 5.
Future의 한계 public class dd3 { private static Thread main; public static void main(String[] args) { ExecutorService executor = Executors.newCachedThreadPool(); Future future = executor.submit(dd3::doSomething); main = Thread.currentThread(); try { Double result = future.get(1, TimeUnit.SECONDS); System.out.println(result); } catch (InterruptedEx.. 2026. 5. 3.
Executor의 계층도 그림 1. ScheduledThreadPollExecutor : 스케줄러용 스레드 풀, 스프링의 @Scheduled에서 사용2. ForkJoinPoll : 작업을 쪼개고 합치는 분할정복을 위해 나온 스레드 풀, StreamAPI와 가상 스레드의 스케줄러에서 사용3. ThreadPerTaskExecutor : 요청당 스레드4. ThreadPoolExecutor : 기본 스레드 풀, 흔히 아는 톰캣 스레드 풀이 이것을 활용 2026. 5. 3.
Virtual Thread (1) - JEP444 1. 가상스레드의 목표2. Thread-per-request의 한계3. Thread-per-request의 한계를 극복하기 위해서 했던 기존 방법4. 가상 스레드의 탄생배경5. 가상 스레드와 플랫폼 스레드6. 가상 스레드 vs 플랫폼 스레드 테스트7. 가상 스레드를 사용해야할 때 https://openjdk.org/jeps/444 JEP444를 보고 요약했습니다. 3분의 1정도 한거 같네요 가상스레드는 JDK21부터 지원되었다.모든 가상 스레드는 스레드 로컬을 가진다. 프리뷰 단계에서는 스레드 로컬이 없는 가상 스레드의 생성이 가능했지만 스레드 로컬 자원이 보장됨으로써 훨씬 더 많은 기존 라이브러리를 가상 스레드와 함께 변경없이 사용할 수 있다.가상 스레드도 생애 전반에 걸쳐 모니터링 되며 새로운 스레드.. 2026. 5. 3.
소켓의 생성 1. 프로토콜 체계2. 소켓 타입3. 통신에 사용되는 프로토콜 정보이 3가지를 매개변수로 만들어짐1. 프로토콜 체계PF_INET IPv4 인터넷 프로토콜 체계PF_INET6 IPv6 인터넷 프로토콜 체계 PF_LOCAL 로컬 통신을 위한 UNIX 프로토콜 체계PF_PACKET Low Level 소켓을 위한 프로토콜 체계PF_IPX IPX 노벨 프로토콜 체계2. 타입연결지향 (SOCKET_STREAM)비연결지향 (SOCKET_DGRAM)3. 정보같은 프로토콜 체계안에 전송방식이 동일한 프로토콜이 둘 이상 존재할 수 있기 때문에 필요TCPUDP 2026. 5. 2.
자바의 6가지 가비지 컬렉터 Serial GC싱글스레드 동작세대별 이론 기반 동작 영 꽉차면 마이너GC올드 꽉차면 풀GC 코어가 하나거나 메모리가 1792MB보다 작으면 요게 디폴트싱글 코어나 사용하는 메모리가 적으면 G1보다 좋음어차피 코어가 하나면 GC는 CPU를 집중적으로 쓰기 때문에 싱글 스레드로 하는게 좋음 컨텍스트스위칭 비용이없자나어차피 GC끝날때까지 STW고 그냥 한번에 제대로 끝내는 것 또 코어가 여러개라도 메모리가 엄청작으면 대충 100MB정도면 이게 더 좋음 왜냐하면 병렬로한다고 동기화 비용등 치를바에는 그냥 한번에 Parallel GCjdk 5~8에서 코어가 2개이상 메모리가 1792MB보다 크면 디폴트였음 (서버클래스)멀티스레드 동작모든 코어에 GC를 할당쓰루풋 = 애플실행시간 / 전체실행시간 = GC가 일어.. 2026. 5. 2.
Single Flight 운영 중 스레드 풀 포화 비율 50% 식별, Soft TTL 전환으로 5배 개선 1. 배경2. 결론 요약3. 스탬피드 발생 상황4. 싱글 플라이트5. 가상 스레드 (자바 25)6. PER 7. 소프트 TTL 1. 배경비밀로그에는 다른 사용자의 롤링페이퍼로 가기위해 모든 회원의 목록을 볼 수 있는 공간이 있다. 캐시 구조는 String을 쓰며 키는 member:page:0:size:10 형식으로 0페이지의 사이즈 10 을 나타낸다.값에는 회원 이름이랑 회원 ID의 목록을 JSON으로 넣었다. 사용자가 요청한 페이지와 사이즈를 그대로 캐싱하여. 캐시 어사이드로 갱신하고 삽입시에는 DB에만 저장한다. TTL은 1분이다. 캐시 스탬피드 방지 목적으로 싱글플라이트를 적용하였는데 스레드 스파이크 현상이 식별되었다.따라서 다른 스탬피드 방지 전략들을 테스트 하였다.스탬피드 발생 상황부터 천천히.. 2026. 4. 25.
풀 GC - 마크 스윕 컴팩트 알고리즘 그림 마크스윕콤팩트 1콤팩트 2콤팩트 3콤팩트 4마크 스윕 컴팩트는 마크 카피와 다르게 직접적으로 메모리를 제거하지 않음마킹이 안된 객체는 객체 할당시 덮어쓰기를 함또한 마크 카피는 객체하나마다 마크와 카피가 일어나서 한 번의 순차적 스캔으로 모든 정리를 끝낼 수 있지만마크 스윕 컴팩트는 각 단계마다 힙 메모리 전체에 대하여 순차적 스캔이 발생하여 느림 2026. 4. 23.