씨예스 면접 준비 1주차 - JAVA(1)

최수정·2023년 4월 4일

백엔드 면접준비

목록 보기
1/1

질문 내용은 이 페이지(링크)를 참조했습니다.

JVM의 메모리 구조에 대해서 설명해 주세요


✅ JVM 이란?

  • 자바 프로그램 실행환경을 만들어 주는 소프트 웨어.

  • 자바 실행 환경 JRE(Java Runtime Environment)에 포함되어 있다.

  • JVM을 사용하면 하나의 바이트 코드로 모든 플랫폼에서 동작하도록 할 수 있다.

  • ※ Java는 플랫폼에 종속적이지 않지만 JVM은 플랫폼에 종속적이다.

    리눅스의 JVM과 윈도우의 JVM은 서로 다르다. 자바로 작성된 모든 프로그램은 자바 가상 머신에서만 실행될 수 있으므로, 자바 프로그램을 실행하기 위해서는 반드시 자바 가상 머신이 설치되어 있어야 한다.

✅ JVM 메모리 구조

프로그램이 실행되면 JVM은 OS로부터 이 프로그램이 필요로 하는 메모리(Runtime Data Area)를 할당받고, JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.

image-20230404163042550

모든 스레드가 공유해서 사용 ( GC의 대상 ) - 힙 / 메서드
스레드마다 하나씩 생성 - 스택/PC레지스터/네이티브 메서드 스택

image-20230404171322106

  • 메서드 (스태틱) 영역

    • 클래스 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보와 같은 각종 필드 정보들과 메서드 정보, 데이터 Type 정보, Constant Pool, static변수, final class 등이 생성되는 영역
    • 간단히 말하자면 메서드 영역에는 정적 필드와 클래스 구조만을 갖고 있다고 할수있다.
    • JVM 시작시 생성, 프로그램 종료 시까지 데이터 유지
  • 힙 영역

    • new 키워드로 생성된 참조형 데이터 타입을 갖는 객체(인스턴스), 배열 등이 저장 되는 공간

      Heap 영역에 있는 오브젝트들을 가리키는 참조 변수는 stack에 적재
      image-20230404174942468

    • 힙 영역에 보관되는 메모리는 Stack 영역과 다르게 메모리 호출이 끝나도 사라지지 않고 유지된다. ( 단, GC에 의해 삭제 or JVM이 종료 시 삭제됨. )

    • 힙 메모리가 가득차면 java.lang.OutOfMemoryError : Java Heap Space 에러를 발생

    • 주기적으로 GC가 제거하는 영역, 효율적인 GC를 위해 크게 3가지의 영역으로 나눈다.

      image-20230404164422342

      Generation설명GC
      YoungHeap 영역에 객체가 생성되면 최초로 Eden 영역에 할당됨. 그 후 데이터가 어느정도 쌓이면, 참조정도에 따라 survivor의 빈공간으로 이동하거나 회수됨. (Minor GC)Minor
      Tenured위 단계에서 또 참조정도에 따라 이동되게 되는 공간. 이 영역에서 데이터 허용치가 초과되면, 이 영역에 있는 모든 객체를 검사하여 한꺼번에 삭제한다.Major
      Permanent= Merhod Area, java8 부터는 사라지고, 이 영역에 저장되던 데이터들은 heap, metaspace 영역으로 이동되었다.X
  • 스택영역

    • 지역변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값 등이 생성되는 영역

    • 프로그램 실행 과정에서 임시로 할당되고, 끝나면 소멸되는 것들이 저장된다. - 생명주기가 매우 짧음.

    • 기본타입 변수들(int, double 등)이 실제 값과 함께 저장

    • 스택 메모리가 가득차면 자바에서는 java.lang.StackOverFlowError를 발생.

    • https://tv.kakao.com/v/426964287 - 코드 실행 상황 별 메모리 적재 상황 동영상

  • PC 레지스터
    • 쓰레드가 생성될 때마다 생성되는 영역
    • 현재 스레드가 실행되는 부분의 주소와 명령을 저장하고 있음
  • Native 메서드 스택
    • 자바 이외의 언어(C, C++, 어셈블리 등)로 작성된 네이티브 코드를 실행할 때 사용되는 메모리 영역
    • C/C++ 등의 코드를 수행하기 위한 스택

JVM은 어떤 방식으로 코드를 해석하고 실행시키는지 흐름에 맞게 설명해 주세요. (Java 실행 흐름)


1. JVM은 OS로부터 메모리를 할당한다.

2. 자바 컴파일러가 자바 소스코드를 자바 바이트코드로 컴파일한다

--- 이 바이트코드 파일을 실행 하는 순간 JVM이 동작된다. ----

3. Class Loader를 통해 JVM Runtime Data Area로 로딩한다.

  • 자바는 동적으로 클래스를 읽어오는데, 이때 동적으로 클래스를 로딩해주는 역할을 클래스 로더가 한다.

  • .class(바이트)파일을 묶어서 운영체제로부터 할당 받은 메모리(JVM Runtime Data Area)의 Method Area에 적재한다.

4. Runtime Data Area에 로딩 된 .class들은 Execution Engine을 통해 해석한다.

  • 이 과정에서 자바 바이트 코드를 JVM이 컴퓨터가 실행할 수 있는 형태로 변경함. 바이트 코드는 JVM이 이해할 수 있는 언어이고 이를 컴퓨터에서 실행시키기 위해서는 Native code로 변환해야 하기 때문.
  • Execution Engine에는 JIT 컴파일러와 인터프리터가 있다.
    • 인터프리터 - 바이트 코드를 한줄한줄 읽으면서 OS가 실행할 수 있도록 기계어로 번역, 실행속도가 느린 단점
    • JIT 컴파일러 - 자주 반복되는 코드를 기계어로 변환해서 캐싱 함, 실행속도가 빨라지지만 nativecode로 변환하는데 비용이 발생
    • 이런 변환 비용 때문에 jvm은 모든 코드를 JIT Compiler방식으로 실행하지 않고 인터프리터 방식을 사용하다 자주 사용되는 코드만 캐싱 함.
    • JIT 컴파일러와 인터프리터는 동시에 런타임 영역에서 다른스레드에서 실행됨

5. 해석된 바이트 코드는 Runtime Data Area의 각 영역에 배치되어 수행하며 이 과정에서 Execution Engine에 의해 GC의 작동과 스레드 동기화가 이루어진다.

✅ JVM 메모리구조 + 동작방식

출처

[Java] 자바 JVM 내부 구조와 메모리 구조에 대하여 (tistory.com)

[Java] 메모리 구조 메소드(Method), 스택(Stack), 힙(Heap) 영역에 대하여 (tistory.com)

JAVA :: 자바 메모리 구조 - 2. 힙 영역(Heap Area)과 스택 영역(Stack Area) 비교 (wanzargen.me)

☕ 그림으로 보는 자바 코드의 메모리 영역(스택 & 힙) (tistory.com)

☕ JVM 내부 구조 & 메모리 영역 💯 총정리 (tistory.com)

JVM 내부 동작 원리 & 자바 컴파일,실행 순서 - 런타임 영역, JIT 컴파일러, 인터프리터 (tistory.com)

Chat GPT

0개의 댓글