본문 바로가기
Java

JVM Stack & Heap

by byeongoo 2021. 1. 17.

이번 포스팅은 우아한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