CS
[CS] 기술면접 - JVM 메모리 구조
j9972
2022. 12. 26. 17:33
728x90
JVM
JVM = 자바 가상 머신
- JAVA 와 OS 사이에서 중개자 역할을 수행하며, JAVA가 OS에 구애 받지 않고 프로그램을 실행할 수 있도록 돕는다.
- GC를 이용해 메모리 관리도 자동으로 수행하며, 스택 기반으로 작동한다
먼저, 자바 컴파일러에 의해서 자바 소스 코드는 바이트 코드로 전환된다.
이러한 바이트 코드를 JVM이 읽어서 여러 OS에서 프로그램을 실핼할 수 있게 해준다
JVM 메모리 구조
JVM 메모리 구조는 크게 4가지로 분류할 수 있다.
- GC
- Execution Engine
- Class Loader
- Runtime Data Area
GC
- 힙 메모리 영역에서 생성된 객체들 중에서 참조되지 않은 객체들을 탐색 후 제거하는 역할을 한다.
- 이때, GC가 역할을 하는 시간은 언제인지 전확히 알 수 없다.
Execution Engine
- JVM내의 Runtime Data Area에 배치된 바이트 코드들을 명령어 단위로 읽어서 실행한다. ( 최초에는 인터프리터 방식 ( 속도가 느렸음 ) → JIT 컴파일러로 속도 보완 )
- JIT는 바이트 코드를 어셈블러 같은 네이티브 코드로 바꿈으로써 실행이 빠르지만 역시 변환하는데 비용이 발생하였습니다. 이 같은 이유로 JVM은 모든 코드를 JIT 컴파일러 방식으로 실행하지 않고, 인터프리터 방식을 사용하다가 일정한 기준이 넘어가면 JIT 컴파일러 방식으로 실행합니다.
Class Loader
- JVM 내로 클래스 파일을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈인데, 런타임 시에 동적으로 클래스를 로드한다.
- "javac" 를 통해서 컴파일 한다 ( JVM으로 이동해서 class Loader로 들어온다 )
- java에서는 class 코드들은 바이트 코드이다. ( c언어에서는 바로 기계어로 바뀐다 )
Runtime Data Area
- JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역
- Method area - 모든 쓰레드가 공유하는 메모리 영역 ( 클래스, 인터페이스, 메소드,필드 등의 바이트 코드들을 보관한다 )
- heap area - 모든 쓰레드가 공유하며, new 키워드로 생성된 객체와 배열이 생성되는 영역이며 메소드 영역에 로드된 클래스만 생성이 가능하고 GC가 참조되지 않는 메모리를 확인해 삭제되는 영역
- stack area - 메서드 호출 시마다 각각의 스택 프레임(그 메서드만을 위한 공간)이 생성하며, 메서드 수행이 끝나면 프레임별로 삭제
- PC Register - 쓰레드가 시작될때 생성, 생성될 때마다 생성되는 공간으로 쓰레드 마다 하나씩 존재하며, 쓰레드가 어떤 부분을 무슨 명령으로 실행해야 할지에 대한 기록을 하는 부분으로 현재 수행중인 JVM 명령의 주소를 갖는다
- Native method stack - java외 언어로 작성된 네이티브 코드를 위한 메모리 영역이다.