본문 바로가기

Java17

메서드 영역의 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.
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.
자바의 6가지 가비지 컬렉터 Serial GC싱글스레드 동작세대별 이론 기반 동작 영 꽉차면 마이너GC올드 꽉차면 풀GC 코어가 하나거나 메모리가 1792MB보다 작으면 요게 디폴트싱글 코어나 사용하는 메모리가 적으면 G1보다 좋음어차피 코어가 하나면 GC는 CPU를 집중적으로 쓰기 때문에 싱글 스레드로 하는게 좋음 컨텍스트스위칭 비용이없자나어차피 GC끝날때까지 STW고 그냥 한번에 제대로 끝내는 것 또 코어가 여러개라도 메모리가 엄청작으면 대충 100MB정도면 이게 더 좋음 왜냐하면 병렬로한다고 동기화 비용등 치를바에는 그냥 한번에 Parallel GCjdk 5~8에서 코어가 2개이상 메모리가 1792MB보다 크면 디폴트였음 (서버클래스)멀티스레드 동작모든 코어에 GC를 할당쓰루풋 = 애플실행시간 / 전체실행시간 = GC가 일어.. 2026. 5. 2.
풀 GC - 마크 스윕 컴팩트 알고리즘 그림 마크스윕콤팩트 1콤팩트 2콤팩트 3콤팩트 4마크 스윕 컴팩트는 마크 카피와 다르게 직접적으로 메모리를 제거하지 않음마킹이 안된 객체는 객체 할당시 덮어쓰기를 함또한 마크 카피는 객체하나마다 마크와 카피가 일어나서 한 번의 순차적 스캔으로 모든 정리를 끝낼 수 있지만마크 스윕 컴팩트는 각 단계마다 힙 메모리 전체에 대하여 순차적 스캔이 발생하여 느림 2026. 4. 23.
마이너 GC - 마크 카피 알고리즘 그림 마크카피카피1카피2카피3카피4참고로 마크가 모든 영 제네레이션에 대해 전부 끝나고 카피를 하는게 아님객체 하나마다 마크가 일어날 때 바로 카피가 일어남 따라서 마크 스윕 콤팩트와 다르게 순차적 스캔을 하지 않아 빠름 이후에 새로운 객체는 Eden에 생성되고 S1쪽에 복사를 시도완료되면 Eden과 S0는 통으로 날림그 다음에는 Eden과 S1을 날리면서 반대로 계속 2026. 4. 9.
GC의 힙 메모리 사이즈 동적 변동 디폴트 가비지 컬렉터여러 가비지 컬렉터가 있지만 서버 사양에 따라 디폴트로 정해지는 가비지 컬렉터가 다르다G1 GC가 디폴트로 등록되는 경우는 서버가 두 개이상의 프로세서를 가지며 RAM 크기가 1.8GB 이상인 경우이며 그 외에는 Serial GC가 디폴트로 등록된다. 따라서 대부분의 서버는 G1 GC가 디폴트로 볼 수 있다. 참고로 내가 운영하는 비밀로그 백엔드 서버는 t2.micro 사양이고 Serial GC를 쓴다. 프로세서가 하나면 Serial GC가 성능상 우위일 때가 많다. 힙 메모리의 동적 변동JVM의 힙 사이즈는 아래와 같이 결정된다.initial heap size 시작 크기 - 기본 값 RAM의 1 / 64maximum heap size 최대 크기 - 기본 값 RAM의 1 / 4mini.. 2026. 4. 2.
JVM 메서드 영역 : 프로그램을 실행하는데 필요한 공통 데이터 관리. 이 영역은 프로그램의 모든영역에서 공유- 클래스 정보 : 클래스의 실행 코드 (바이트 코드), 필드 메서드와 생성자 코드등- static 영역 : static 변수 보관- 런타임 상수 풀 : 프로그램을 실행하는데 필요한 공통 리터럴 상수 보관 스택 영역 : 자바 실행 시, 하나의 실행 스택 생성. 각 스택 프레임은 지역 변수, 중간 연산 결과, 메서드 호출 정보 등 포함- 스택 프레임 : 스택 영역에 쌓이는 네모 박스가 하나의 스택 프레임. 메서드를 호출할 때 마다 하나의 스택 프레임이 쌓이고 메서드가 종료되면 해당 스택 프레임이 제거 됨 힙 영역 : 객체와 배열이 생성되는 영역. 가비지 컬렉션이 이루어지는 주요 영역 더 이상 참조되지 않는.. 2026. 2. 8.
synchronized vs ReentrantLock 자바의 모든 객체에는 모니터가 있다. synchronized는 이 모니터락을 이용한다.하지만 락 대기시간을 설정못하고 락 획득 순서가 보장되지 않는 단점이 있다. Lock인터페이스는 이런 문제를 해결해준다 대표적인 구현체로는 ReentrantLock이 있다.ReentrantLock은 모니터를 이용하는게 아니라 자체적인 락을 이용한다.오래 기다린 스레드가 먼저 실행되는 공정모드와 비공정모드 선택가능하다 비공정 모드는 락 획득 속도가 빠르고 선점 가능하며 기아 가능성이 있다.공정 모드는 락 획득 속도가 느리고 기아 현상이 일어나지 않는다. 락 획득 순서가 보장된다. 비공정 모드는 내부가 큐로 구현되어있어 대부분 상황에는 순서대로 시행된다 하지만 경합이 심해 새로운 스레드가 들어오면 가끔 선점이 일어나긴한다.. 2026. 2. 6.
자바 메모리 모델 (JMM) 멀티스레드에서 스레드간의 상호작용을 주로 정의함핵심내용은 happens before라는 관계에 대한 정의자바 메모리 모델에서 스레드간의 작업 순서를 정의하는 개념만약 작업A가 작업B보다 happens before 관계에 있다면 작업A가 메모리 변경한 건 작업B에서 볼 수 있다는 뜻작업 A에 volatile가 있으면 작업 B에서 볼 수 있다 등등 2026. 2. 2.