본문 바로가기

Java/GC5

메서드 영역의 GC와 Hibernate의 프록시 생성 로직에 관하여 자바 명세에서 GC가 메서드 영역을 청소해야한다고 되어있지는 않다. 일부 GC 구현체는 메서드 영역을 청소하지 않는다.비용 효율의 문제다 힙 메모리의 뉴제네레이션의 회수율은 GC한번으로 메모리공간의 70 ~ 99%를 회수한다.반면 메서드 영역은 회수 조건이 까다로워서 효율이 낮다. 그러나 많은 GC 구현체들은 메서드 영역을 청소한다.크게 두 가지를 회수한다. 바로 더 이상 쓰이지 않는 상수와 클래스다. 1. 상수문자열 상수풀에 "hello"가 있으나 시스템에서 "hello"인 문자열이 하나도 없다. 즉 상수 풀 안의 "hello" 상수를 참조하는 문자열 객체가 전혀 없고 리터럴을 사용하는 코드가 한 곳도 없으면 회수가 일어난다. 참고 : 문자열 상수풀은 현재 힙에 위치한다. 그러나 이것을 관리하는 문자열.. 2026. 5. 15.
자바의 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.