본문 바로가기

Java/JVM8

JVM의 객체 생성 과정 자바 컴파일러는 new 키워드를 발견하면 두 개의 바이트 코드 명령어로 변환한다. 1. new2. invokespecial new는 JVM 관점에서 객체를 생성한다 (메모리 할당)invokespecial은 자바 관점에서 객체를 생성한다 (생성자 실행) 1. new1.1 확인new 명령의 매개변수가 런타임 상수 풀의 클래스를 가리키는 심벌참조인지 확인한다.즉, 메타스페이스에 있는 클래스정보를 가리키는지 확인한다.그 다음 해당 클래스가 로딩, 해석, 초기화 되었는지 확인한다.그 다음 새 객체를 담을 메모리를 할당한다. 1.2 메모리 할당메모리 할당 방식에는 두가지가 존재하며 어떤 방식을 택하는지는 가비지 컬렉터의 종류에 따라 다르다.1. 포인터 밀치기 방식2. 프리리스트 방식 포인터 밀치기 방식은 자바 힙이.. 2026. 5. 15.
JVM 메서드 영역 : 프로그램을 실행하는데 필요한 공통 데이터 관리. 이 영역은 프로그램의 모든영역에서 공유- 클래스 정보 : 클래스의 실행 코드 (바이트 코드), 필드 메서드와 생성자 코드등- static 영역 : static 변수 보관- 런타임 상수 풀 : 프로그램을 실행하는데 필요한 공통 리터럴 상수 보관 스택 영역 : 자바 실행 시, 하나의 실행 스택 생성. 각 스택 프레임은 지역 변수, 중간 연산 결과, 메서드 호출 정보 등 포함- 스택 프레임 : 스택 영역에 쌓이는 네모 박스가 하나의 스택 프레임. 메서드를 호출할 때 마다 하나의 스택 프레임이 쌓이고 메서드가 종료되면 해당 스택 프레임이 제거 됨 힙 영역 : 객체와 배열이 생성되는 영역. 가비지 컬렉션이 이루어지는 주요 영역 더 이상 참조되지 않는.. 2026. 2. 8.
자바 메모리 모델 (JMM) 멀티스레드에서 스레드간의 상호작용을 주로 정의함핵심내용은 happens before라는 관계에 대한 정의자바 메모리 모델에서 스레드간의 작업 순서를 정의하는 개념만약 작업A가 작업B보다 happens before 관계에 있다면 작업A가 메모리 변경한 건 작업B에서 볼 수 있다는 뜻작업 A에 volatile가 있으면 작업 B에서 볼 수 있다 등등 2026. 2. 2.
메모리 가시성 멀티스레드에서 어떤 스레드에서 힙 메모리에 있는 값을 변경했다고 다른 스레드에서 바로 그 값이 보이는 것이 아니다.여러 코어가 있는 CPU의 경우 각 스레드가 캐시 메모리를 가지고 있다면 메인 스레드 변경이전에 캐시메모리에 변경한다.만약 다른 스레드에서 힙 메모리의 값에 대해 while문을 돌고 있었다면 그 스레드는 자신의 캐시 메모리를 확인하기 때문에 영원히 while문이 끝나지 않을 수 있다. 보통 컨텍스트 스위칭 할 때 캐시 메모리를 비우기 때문에 메인메모리에 쓰고 캐시메모리에 옮겨쓰는게 일어나지만 컨텍스트 스위칭에서 무조건 반영된다고 확신할 수 없다. 자바의 volatile는 캐시 메모리가 아닌 메인 메모리에 직접 쓰고 조회하라는 명령어이다.캐시 메모리를 사용하는 것보다 성능이 느려진다. 대략 5.. 2026. 2. 2.
스레드 로컬 각 스레드마다 별도 내부 저장소가 있다 빈은 싱글톤이라 애플리케이션전역에서 하나만 생성되는데 누가 필드에 철수라쓰고 다른 스레드가 영희라고 쓰면 값이 바뀜그래서 스레드마다 내부 저장소가 필요 스레드 로컬 모두 사용하고 나면 저장된 값을 꼭 제거해줘야 안하면 메모리 누수 가능함WAS의 스레드 풀을 사용하는 경우 기존 값이 남아있을 수도 있음 2026. 1. 23.
리플렉션 직접 함수를 호출하지않고 클래스와 메서드의 메타정보를 이용해서 함수를 호출할 수 있다.메서드 2개를 직접호출하지않고 Method.invoke() 하나만으로 각자 다른 메서드를 호출할때 넣어주기만 하면 생성할수있다하지만 동적으로 계산하기 때문에 컴파일오류를 잡지못하고 런타임오류만 뜨기 때문에 잘 사용되지 않는다예를들어 a라는 메소드가 있는데 실수로 Method.invoke("aa")를 해버리면 런타임에러가 발생한다. 메타정보는 컴파일시점에 결정되어있지만 조회하고 활용하는 행위는 런타임때 이루어짐컴파일러(javac)는 메타정보를 바이트코드에 이미기록함JVM 클래스 로딩때 클래스로더가 .class를 읽고 메타스페이스에 클래스 메타정보 적재 예외적으로 JDK동적프록시 CGLIB ByteBuddy는 런타임때 .. 2026. 1. 22.
자바의 컴파일, 클래스 로딩, 실행 구조 정리 1. 자바 실행 구조 개요일반적으로 프로그래밍 언어는 컴파일 → 링크 → 실행(런타임) 단계로 나뉜다.자바는 C/C++과 달리컴파일 시점과 실행 시점이 명확히 분리된 구조를 가진다.자바에서는.java 파일을 컴파일하면 .class 파일이 생성되고,이 .class 파일은 자바 바이트 코드로 이루어져 있다.2. 자바 컴파일 단계.java 파일은 javac에 의해 컴파일되어 .class 파일이 된다..class 파일의 내용은 자바 바이트 코드클래스 로더가 실제로 로딩하는 대상은 .class 파일이다바이트 코드는 사람이 직접 분석하기는 어렵다.일반적으로 16진수 형태의 숫자 나열이기 때문에 그대로 읽는 것은 힘들다.다만,javap -c 명령어로 디스어셈블 가능IntelliJ에서는 “바이트코드 보기” 메뉴 제공이.. 2026. 1. 3.
데몬 스레드 스레드는 크게 2가지로 나눌 수 있다. 1. 사용자 스레드2. 데몬 스레드 사용자 스레드는 우리가 보통 생각하는 스레드이고 비즈니스 로직을 처리하는 바로 그 스레드 이다. 프로그램의 주요 작업을 수행하며 작업이 완료될 때 까지 실행된다. 모든 사용자 스레드가 종료되면 JVM도 종료된다. 데몬 스레드는 백그라운드에서 보조적인 작업을 수행한다. 모든 사용자 스레드가 종료되면 데몬 스레드는 자동으로 종료된다. JVM은 데몬 스레드의 실행 완료를 기다리지 않고 종료된다. 데몬 스레드가 아닌 모든 스레드가 종료되면, 자바 프로그램도 종료된다. 자바 프로그램이 끝난다는 거는 사용자 스레드가 종료되는 시점이다. 스레드의 종료란 각 스레드의 스택이 모두 빠져나가고 하나도 남지 않는 시점이다. 2025. 8. 17.