CS

[11/18] JVM Stack & Heap

콩스프 2022. 11. 18. 08:55

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