[Java] JVM 구조, 메모리와 코드의 흐름

쓰옹·2022년 11월 30일
0

📙 Java 잡아🤏

목록 보기
15/25

Java로 코드 작성 시 실행되는 과정

JVM (Java Virtual Machine)

  • 자바 가상 머신
  • 자바 프로그램 실행 환경을 만들어주는 소프트웨어
  • 자바 코드를 컴파일하여 .class 바이트 코드로 만들면 이 코드를 실행해 각 OS에 맞는 실행파일로 바꿔줌

자바개발환경 설치

  • 자바설치한다 == 자바 JDK 설치한다
  • 자바 프로그램을 만들기 위해서는 JDK가 있어야 함
    • 실행하기 위해서는 JRE만 있으면 됨
  • 통합개발환경(IDE) 설치

JDK (Java Development Kit)

  • 자바 프로그램에 필요한 라이브러리와 플랫폼 포함

JRE (Java Runtime Environment)

  • 자바 실행 환경
  • 자바에서 제공되는 기본 라이브러리 포함

메모리와 실행 엔진

JVM 구조

  • Class Loader Subsystem

    • 런타임에 클래스를 처음으로 참조할 때 해당 클래스를 로드하고 링크함
    • Loading
      • .class 에서 바이트 코드를 읽고 데이터를 Method Area에 저장
      • 저장하는 데이터들
        • FQCN(Fully Quallified Class Name): package를 포함한 Class이름
        • 클래스 | 인터페이스 | 이넘(Enum)
        • 메소드와 변수
      • 로딩이 끝나면 해당 클래스 타입의 객체를 생성하여 Heap 영역에 저장
    • Linking
      • Verify , Prepare , Resolve(Option) 세 단계
      • 검증(Verify): .class 파일 형식 유효한지 체크
      • 준비(Prepare): 클래스변수(static변수)와 기본값이 필요한 메모리 준비
      • Resolve: 심볼릭 메모리 레퍼런스를 실제 메모리영역에 있는 레퍼런스로 교체
    • Initialization
      • static 변수 값 할당. 붙은 친구들 초기화. (static block 실행)
  • 메모리

    • 메소드 영역(Method Area) == 클래스영역, static영역

    • Heap - 객체 저장

      • 멤버변수(인스턴스 변수)가 할당받는 메모리 공간
    • Stack - 스레드마다 런타임 스택을 만들고 스택프레임이라 불리는 블록을 쌓음

      • LIFO (Last In First Out)
        • 함수를 호출한 순서대로 메모리 공간이 만들어지고 맨 마지막에 호출한 함수부터 반환
      • 함수만을 위한 메모리 공간
        public class Main {
        	public static void main(String[] args) {
        		int num1 = 10;
        		int num2 = 20;
        		
        		int sum = add(num1, num2);
        		System.out.println(num1 + " + " + num2 + " = " + sum);
        	}
        
        	public static int add(int n1, int n2) {
        		int result = n1 + n2;
        		return result;
        	}
        }
      1. main() 함수가 사용할 메모리 공간이 스택에 생성
      2. main()에서 add() 호출
      3. add()함수가 사용할 메모리 공간이 스택에 생성
      4. add() 함수 수행이 끝나면 항당했던 메모리 공간 해제. 자동으로 사라짐
    • 메모리 사용 방식

      • 코드실행 영역 + 데이터 저장 영역
  • 실행엔진

    • JIT(Just In Time) 컴파일러
      • 실행 시점에 기계어 코드 생성, 코드가 반복되면 이전 생성된 기계어 재사용
      • 속도를 높임
    • GC(Garbage Collector)
      • 더 이상 참조되지 않는 객체 정리
      • 힙에 생성된 인스턴스가 GC에 의해 수거되면 메모리에서 사라짐
  • JNI(Java Native Interface), Native Method Library

    • 네이티브 메소드 인터페이스 & 라이브러리
    • 메소드에 native 키워드가 붙어있음
    • Java언어 자체로 해결이 안되는 경우 대처 방법
      • C, C++, 어셈블리로 작성된 함수를 사용할 수 있는 방법 제공



🧐 reference


스파르타코딩클럽 자바심화 강의

[1주차] JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.

박은종, 『Do it! 자바 프로그래밍 입문』, 이지퍼블리싱(주), 2018

profile
기록하자기록해!

0개의 댓글