Intro.
- C/C++ 는 컴파일 플랫폼과 타겟 *플랫폼이 다를 경우, 프로그램이 동작하지 않음
- C/C++는 컴파일을 하면 생성되는 기계코드가 플랫폼에 dependent하기 때문
- OS마다 지원하는 System Call Interface가 다름
- CPU Architecture마다 지원하는 Instruction Set Architecture가 다름
*플랫폼 : 운영체제 + CPU 아키텍처
- 동일한 플랫폼에서 컴파일과 실행을 같이 한다면, 프로그램은 아무 문제 없이 동작
- 플랫폼이 달라질 경우, 타겟 플랫폼에서 프로그램이 동작하지 않음
➡ 타겟 플랫폼에 맞춰 컴파일을 해야함
Cross Compile
EX) 리눅스에서 윈도우를 타겟으로 잡고 컴파일을 할 수 있음
JVM
[Java] JVM, JRE, JDK
1. 자바 가상 기계 (JVM) 운영체제는 자바 프로그램을 바로 실행할 수 X -> 자바 프로그램은 완전한 기계어가 아닌, 중간 단계의 바이트 코드 이기 때문 -> 이를 해석하고 실행할 수 있는 가상의 운
bean-soup-99.tistory.com
- 자바 바이트코드는 타겟 플랫폼에 상관없이 JVM 위에서 동작
- 단, JVM은 타겟 플랫폼에 의존
- java 소스코드는 컴파일러(javac)를 거치고 나면 바이트 코드가 됨
- 자바 바이트코드는 JVM이 설치된 플랫폼이라면 어디든 상관없이 잘 동작함
WORA - "Write Once, Run Anywhere"
플랫폼에 맞는 JVM만 있다면 자바 코드를 작성해서 컴파일 후 배포하면,
어떤 플랫폼이든 다시 컴파일할 필요 없이 실행시킬 수 있다!
JVM vs Cross Compile
Q) 크로스 컴파일해서 배포하면 되는데, 굳이 JVM이 도입된 이유가 뭔가?
✔Java ➡ 네트워크에 연결된 모든 디바이스에서 작동하는 것이 목적
- 디바이스마다 운영체제나 하드웨어가 다르기 때문에, 자연스럽게 플랫폼에 의존하지 않도록 언어를 설계
➡ Java Bytecode, JVM
EX) 웹 서버에 있는 .class 파일만 네트워크를 통해 전달해주면 브라우저에 JVM이 설치되어 있어서 실행하기만 하면 되겠다
Runtime Data Area
[Java] 메모리 사용 영역
JVM은 운영체제에서 할당받은 메모리영역 (Runtime Data Area)를 세부영역으로 구분해 사용함 메소드(Method) 영역 코드에서 사용되는 클래스(~.class)들을 클래스 로더로 읽어 클래스별 런타임 상수풀 (ru
bean-soup-99.tistory.com
- JVM이 Java Bytecode를 실행하기 위해 사용하는 메모리 공간
Method Area
- 클래스 로더가 클래스 파일을 읽어오면, 클래스 정보를 파싱해서 저장
- 런타임 상수풀, 필드, 메소드, static 변수, 생성자 등을 저장
- JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역
Heap
- 프로그램을 실행하면서 생성한 모든 객체 인스턴스를 저장
- 객체에 대한 힙 스토리지는 Garbage Collecor (자동 스토리지 관리 시스템)에 의해 회수됨
- JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역
- Garbage Collector 가 사용할 수 있는 것보다 많은 Heap이 필요하면 OutOfMemoryError 발생
Program Counter
- 각 스레드는 메서드를 실행하고 있음
- PC는 그 메서드 안에서 몇 번째 줄을 실행해야 하는지 나타내는 역할
Stack
- 스레드별로 1개만 존재
- 스레드가 생성될 때 같이 생성됨
- Stack Frame을 저장
✔ Stack Frame
- 스택 프레임은 메서드가 호출될 때마다 생성되어 스택에 push 됨
- 메서드 실행이 끝나면 스택프레임은 pop되어 스택에서 제거됨
- 스택 프레임은 Local variables array, Operand stack, Frame Data를 가짐
- Frame Data : 상수풀, 이전 스택 프레임에 대한 정보, 현재 메서드가 속한 클래스/객체에 대한 참조 등의 정보를 가짐
Native Method Stack
- Native Method : Java Bytecode 가 아닌 다른 언어(EX C/C++) 로 작성된 메서드
- Native Method Stack : Native Method를 호출하는 코드를 수행하기 위한 스택
참고문헌
1) [10분 데코톡] 🎅무민의 JVM Stack & Heap
2) [Oracle] Chapter 2. The Structure of the Java Virtual Machine