728x90
이전의 문제
- C / C++ 는 컴파일 플랫폼과 타겟 플랫폼이 다를 경우, 프로그램이 동작하지 않는다.
- Linux → Linux 는 이상이 없지만 Linux에서 컴파일한 파일은 Windows에서 동작하지 않는다.
- 해결책으로 크로스 컴파일(Cross Compile)로 타겟 플랫폼에 맞춰 컬파일한다.
JVM (Java Virtual Machine)?
- 기술적 정의 → 코드를 실행하고 해당 코드에 대해 런타임 환경을 제공하는 소프트웨어 프로그램에 대한 사양
- 일반적 정의 → 자바 프로그램을 실행하는 방법이다. JVM 의 설정을 구성한 다음 설정사항에 따라 실행 중에 프로그램 리소스를 관리
- 자바 코드를 컴파일해서 얻은 바이트 코드를 해당 운영체제가 이해할 수 있는 기계어로 바꿔 실행시켜주는 역할
- 자바는 네트워크에 연결된 모든 디바이스에서 작동하는 것이 목적이었다
- 디바이스마다 운영체제나 하드웨어가 다르기 때문에, 플랫폼에 의존하지 않도록 언어를 설계했다.
- 그 결과 Java Bytecode, JVM
Java code execution process
- Frontend,와 Backend 로 나뉜다.
- Frontend → javac로 소스코드를 분석해 의미를 파악
- Backend → Frontend를 어셈블리 언어로 변환해서 윈도우형, 리눅스형 등이 존재
1. Runtime Data Area
- JVM이 Java Bytecode를 실행하기 위해 사용하는 메모리 공간
- method area, heap → 모든 쓰레드가 공유
- Method Area → Class Loader가 클래스 파일을 읽어오면, 클래스 정보를 파싱해서 저장
- Heap → 프로그램을 실행하면서 생성한 모든 객체를 저장
- Java Stack, pc register, native method stacks : 각 쓰레드에 존재
- Program Counter → 각 스레드는 메서드를 실행하고 있고 pc는 그 메서드 안에서 몇 번째 줄을 실행해야 하는지 나타내는 역할
- Java Stack → 스레드 별로 1개만 존재하고, 스택 프레임은 메서드가 호출될 때마다 생성된다. 메서드 실행이 끝난 프레임은 스택에서 제거된다.
- Native Method Stack → Java Bytecode가 아닌 다른 언어로 작성된 메서드
- .java파일을 컴파일하면 .class파일이 생성되는데 이렇게 생성된 .class파일을 엮어서 JVM이 운영체제로부터 할당받은 메모리영역인 Runtime Data Area로 적재하는 역할
- 자바 애플리케이션이 실행중일 때 수행된다.
- Class Loader에 의해 메모리에 적재된 클래스(바이트 코드)들을 기계어로 변경해 명령어 단위로 실행하는 역할
- 하나하나 실행하는 인터프리터(Interpreter) 방식과 JIT(Just-In-Time) 방식이 있다.
- JIT 컴파일러 → 적절한 시간에 전체 바이트 코드를 네이티브 코드로 변경해서 Execution Engine이 네이티브로 컴파일된 코드를 실행하는 것으로 성능을 높인다.
- Heap 메모리 영역에 생성된 객체들 중에서 참조되지 않는 객체들을 탐색 후 제거하는 역할
- 정확한 시간을 알 수 없다.
- GC가 수행되는 동안 GC를 수행하는 쓰레드가 아닌 다른 쓰레드는 정지된다.
- Full GC가 일어나서 수 초간 모든 쓰레드가 정지한다면 장애로 이어지는 치명적 문제 발생
-Reference
'자바 스터디' 카테고리의 다른 글
리플렉션(Reflection) ? (0) | 2021.11.17 |
---|---|
GC ( Garbage Collection ) ? (0) | 2021.11.10 |
자바의 컴파일 과정과 JVM에서 HEAP의 변화 (0) | 2021.11.03 |
[Java] JVM과 자바의 버전별 변화 (0) | 2021.10.25 |
자바의 발전과정 (0) | 2021.10.21 |