본문 바로가기

전체 글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.