목차
- Post not found: computer-science/java/gc-tunning
- JAVA - Garbage Collection(가비지 컬렉션)
- JAVA - JVM (자바 가상 머신)
JVM (자바 가상 머신)
자바 컴파일러에 의해 생성된 자바 바이트 코드(.class) 를 OS에 맞는 기계어로 변환해 실행할 수 있게 해준다.
클래스 파일로 떨어질 수 있으면 어떤 언어라도 실행이 가능하다. (ex. kotlin)
- 자바 컴파일러에 의해 생성된 바이트 코드를 실행하는 표준이자 구현체다.
- JVM은 각 OS(운영체제) 에 맞게 설계가 돼 있다.
- 자바 바이트 코드만 있으면 JVM을 이용해 어느 운영체제에서나 실행이 가능하다.
- Stack 기반 가상 머신
JVM 구조
Class Loader, Memory, 실행 엔진(Execution Engine) 이 세가지로 구성 돼 있다.
Class Loader
클래스 파일에서 바이트 코드 를 읽고 메모리 에 저장한다.
로딩, 링크, 초기화 세가지 과정을 거친다.
- 로딩
- 클래스로더가 클래스 파일을 읽고 Binary 데이터 를 생성한 뒤 Method 영역 에 저장한다.
- 로딩이 끝나면 해당 클래스 타입의 객체 를 생성한 후 Heap 영역에 저장한다.
- 링크
- verify : 클래스 파일 이 유효한지 확인한다. 바이트 코드가 조작됐을 경우 에러를 발생
- Prepare : 메모리 준비과정
- Resolve : 객체들을 실제 레퍼런스에 연결한다.
- 초기화
- static 값을 초기화 하고 변수를 할당하는 과정
클래스 로더 종류
- 부트 스트랩 클래스 로더
- JAVA_HOME/jre/lib 디렉터리에 위치한 핵심 자바 라이브러리들을 불러들인다
- 확장 클래스 로더
- JAVA_HOME/jre/lib/ext 또는 java.ext.dirs 시스템 변수에 위치해 있는 라이브러리들을 읽어들인다.
- 애플리케이션 클래스 로더
- 애플리케이션 클래스패스(애플리케이션 실행할 때 주는 -classpath 옵션 또는 java.class.path 환경 변수의 값에 해당하는 위치)에서 클래스를 읽는다.
메모리
- 스택 영역
- 각 Thread마다 스택 영역이 존재한다.
- 프로그램 실행과정에서 일시적으로 할당받고 소멸하는 영역
- 메서드 호출시 Stack Frame이 생성되며 메서드 정보, 지역변수들을 저장한다.
- 메서드가 종료되면 삭제된다.
- PC(Program Counter)
- 쓰레드 마다 다음 실행해야 할 명령어 정보가 저장 된다.
- Native method stack
- 바이트 코드가 아닌 기계어로 작성된 프로그램이 저장되는 영역
- 힙 영역
- 모든 인스턴스 객체(Object)가 저장되는 영역
- JVM에 하나 밖에 없는 공유 자원 이다.
- 메소드 영역
- 클래스 수준의 정보 (클래스 이름, 부모 클래스 이름, 메소드, 변수등)가 저장 되고, 공유되는 영역이다.
- 모든 JVM 스레드에서 공유하는 메모리 영역
실행엔진
- 인터프리터
- 바이트 코드를 한줄 한줄 실행한다.
- JIT(Just In Time) 컴파일러
- 인터프리터 방식의 단점을 보완하기 위해 도입된 컴파일러
- 바이트 코드를 네이티브 코드로 컴파일 해준다.
- 일정 수준 이상으로 실행되는 코드가 존재할 때 해당 바이트 코드를 컴파일 한다.(Caching)
- 컴파일 한 결과물은 JVM 내 CodeCache 에 저장 된다.
- GC(Gabage Collection)
- 참조되지 않는 객체를 정리한다.
JVM Default Heap Size 확인
java -XX:+PrintFlagsFinal -version 2>&1 | grep -i -E 'heapsize|MetaspaceSize|version' |