[JAVA] JVM 메모리 구조

eunniverse·2024년 3월 3일
0
post-custom-banner

JVM

  • WHY?
    • C/C++ 은 컴파일하는 플랫폼과 실행할 플랫폼이 다를 경우, 각 플랫폼에 맞게 컴파일이 필요하다. ⇒ 크로스 컴파일 ex. Window 에서 컴파일 후 Linux 에서 동작하는 바이너리를 만드는 것
    • JVM ⇒ C/C++ 에서 발생하는 근본적인 문제를 해결! ⇒ JVM 만 설치하면, 플랫폼의 영향을 받지 않는다.
  • HOW?
  • JAVA CODE 를 JAVAC 가 컴파일 해주고, JAVA Byte code 가 나온다.

    • JVM 이 설치만 되어 있으면 어떤 플랫폼이든 동일하게 동작한다.
      • JVM 이 플랫폼과 관련된 처리를 모두 해주기 때문에 가능한 일이다.
    • .class : byte code 를 담은 파일
  • JAVA 코드 실행 요약 설명

    • 프론트엔드 : 소스코드를 분석해서 의미 파악하여 추상 구문 트리(AST) 가 생성되는 과정

      • JAVAC 가 진행
      • 플랫폼에 영향을 받지 않기 때문에 변경되지 않는다.
      • 추상 구문 트리 (AST)
        • 프로그래밍 언어로 작성된 소스 코드의 추상 구문 구조 트리
        • 예시
    • 백엔드 : 중간 계층 표현을 어셈블리 언어로 변경하는 과정

      • JVM 이 진행
      • 어셈블리 언어는 플랫폼에 종속적이므로 변경된다.
  • JAVA MEMORY?

    • 모든 스레드가 공유하는 영역

      • Method Area
        • 클래스 로더가 클래스 파일을 읽어오면 클래스 정보를 파싱해서 저장
        • 변수, 메서드, 정적변수, 바이트 코드 등을 저장
      • heap
        • 프로그램을 실행하면서 생성한 모든 객체를 저장 (new)
        • GC 에서 지워지거나 JVM 종료될 때까지 유지
        • 참고
    • 스레드 별로 있는 영역

      • Program Counter
        • 스레드는 메서드를 실행하고 있고, 몇번째 줄을 실행하는지 나타내는 역할
      • Stack
        - 메서드 호출될 때 임시로 저장 후 메서드가 끝나면 소멸되는 영역
        - 지역변수와 매개변수 저장
        - 쓰레드마다 생성되는 스택에는 프레임이 들어간다.
      • Stack Frame?
        • Local Variables : 메서드의 지역변수
          • double, long 은 두 칸씩 차지
          • primitive 타입은 값을 프레임에 저장
        • Operand Stack : 메서드 내 계산을 위한 작업 공간
          package main;
          
          class Main {
              public int test() {
                  int a = 4;
                  int b = 3;
                  return a + b;
              }
          }
          
          // 컴파일 후 javap 로 바이트 코드를 확인하면 다음과 같다.
          // javap : 클래스 파일의 바이트 코드를 소스와 함께 보여주는 디어셈블
          $ javac main.java
          
          $ javap -c Main.class
          Compiled from "main.java"
          class main.Main {
            main.Main();
              Code:
                 0: aload_0
                 1: invokespecial #1      // Method java/lang/Object."<init>":()V
                 4: return
          
          // opernad stack
            **public int test();
              Code:
                 0: iconst_4
                 1: istore_1
                 2: iconst_3
                 3: istore_2
                 4: iload_1
                 5: iload_2
                 6: iadd
                 7: ireturn**
          }
        • Constant Pool Reference : 런타임 상수 풀의 참조
      • Native Method Stack
        • JAVA Byte code 가 아닌 다른 언어로 작성된 메서드
          • 성능 향상을 목적으로 사용
        • 참고 : JNI (Java Native Interface)
          • 다른 언어로 만들어진 어플리케이션과 상호 작용할 수 있는 인터페이스 제공하는 프로그램
            • C/C++ ⇒ JNI ⇒ Java

REFERENCE

profile
능력이 없는 것을 두려워 말고, 끈기 없는 것을 두려워하라
post-custom-banner

0개의 댓글