이번 포스팅은 우아한Tech의 무민의 JVM Stack & Heap 영상을 정리한 내용입니다.
1. C/C++의 문제점
C/C++는 컴파일 플랫폼과 타겟 플랫폼이 다를 경우, 프로그램이 동작하지 않는다. 여기서 환경(플랫폼) 이란 운영체제 + CPU 아키텍처를 말한다.
동일한 플랫폼에서 컴파일과 실행을 같이 한다면, 프로그램은 아무 문제 없이 동작한다. 다른 플랫폼에서 동작하게 하려면 타겟 플랫폼에 맞춰서 컴파일을 해야하는데 이를 "크로스 컴파일"이라 한다.
2. JVM으로 C/C++ 문제 해결
- 자바 바이트 코드는 타겟 플랫폼에 상관 없이 JVM 위에서 동작
- JVM은 자바 바이트 코드를 실행할 수 있는 주체(기계)
- JVM이 플랫폼과 관련된 작업들을 대신 해주기 때문에 가능
- 물론, JVM은 타겟 플랫폼에 의존한다. 운영체제가 윈도우면 윈도우용 JVM 설치를 해야함
3. C/C++도 크로스 컴파일해서 배포하면 동작하는데 JVM을 사용하는 이유
- C/C++은 핸드폰, PMP등 여러 기종에 맞게 컴파일을 할 수 없음.
- 자바는 네트워크에 연결된 모든 디바이스에서 작동하는 것이 목적
- 디바이스마다 운영체제나 하드웨어가 다르기 때문에 자연스럽게 플랫폼에 의존하지 않도록 언어를 설계함. 그 결과가 Java Bytecode, JVM
4. Runtime Data Areas
- JVM이 Java Bytecode를 실행하기 위해 사용하는 메모리 공간
- Method Area, Heap : 모든 스레드가 공유를 함
■ Method Area
- Method Area 클래스 로더가 클래스 파일을 읽어오면, 클래스 정보를 파싱해서 Method Area에 저장.
- 클래스 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보같은 필드 정보와 메소드의 이름, 리턴 타입, 파라미터, 접근 제어자 정보같은 메소드 정보, Type정보(Interface인지 class인지), Constant Pool(상수 풀 : 문자 상수, 타입, 필드, 객체 참조가 저장됨), static 변수, final class 변수등이 생성되는 영역
■ Heap
- 프로그램을 실행하면서 생성한 모든 객체를 Heap에 저장
- new 키워드로 생성된 객체와 배열이 생성되는 영역
■ Per Thread(스레드마다 존재)
- Java stacks, pc regisers, native method stacks
■ Program Counter
- 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다. (CPU의 레지스터와 다름)
- 각 스레드는 메서드를 실행하고 있고, pc는 그 메서드 안에서 몇번째 줄을 실행해야한느지 나타내는 역할
■ Stack
- 지역 변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값등이 생성되는 영역
- 스택 프레임임은 메서드가 호출될 때 마다 생성. 메서드 실행이 끝나면 스택 프레임은 pop 되어 스택에서 제거
- Stack Frame
- 스택 프레임은 메서드가 호출될 때마다 새로 생겨 스택에 push 된다.
- 스택 프레임은 Local variables array, Operand stack, Frame Data를 갖는다.
- Frame Data는 Constant Pool, 이전 스택 프레임에 대한 정보, 현재 메서드가 속한 클래스/객체에 대한 참조 등의 정보를 갖는다.
■ Native Method Stack
- Native Method는 Java Bytecode가 아닌 다른 언어로 작성된 메서드를 의미
- 보통 C/C++등의 코드를 수행하기 위한 스택이다.
REFERENCE
'Java' 카테고리의 다른 글
인텔리제이 javadoc 문서 만들기 (0) | 2021.02.22 |
---|---|
[Java] Garbage Collector (0) | 2021.01.17 |
[Java] Comparable과 Comparator을 이용한 정렬 (0) | 2020.07.19 |
[Java] 자바 Collection (0) | 2020.06.14 |
[Java] 객체 값 복사 - clone() 예제 (0) | 2020.05.31 |