Java심화_실시간 1일차

5w31892p·2022년 12월 1일
0

Java_실시간

목록 보기
5/7

keyword

JDK | JRE | JVM
Class Loading | static initialize | Runtime Data Area
Method Area(Static Area) | Stack | Heap
실행 엔진 | GC


체크리스트

✔ Java 코드가 실행되는 과정을 설명할 수 있는가?
✔ JVM 구조를 정리 할 수 있는가?
✔ 코드와 메모리를 연관지어 설명할 수 있는가?


:: 📜 JVM 이해하기

JVM ( Java Virtual Machine )

코드 실행되는 과정

.java --[Compiler]--> .class --[Run]--> JVM --> os --> Hardware (Computer)

:: 📜 JDK 구조

:: JDK

  1. JDK = Java Development ToolKits + JRE
  2. JRE = Java Runtime Environment + JVM

JDK > JRE > JVM & Library

  • JDK 안에 JRE 있고, JRE 안에 JVM과 Library 있음

:: JRE

  • Java 기본 라이브러리 포함됨

:: JDK와 JRE에서 중요한 것

  1. JDK : Javac가 중요
    • Javac == Java Compiler
  2. JRE : lang and util

:: 📜 메모리와 실행 엔진

:: 📜 JDK 구조

:: 📜 JVM 구조

:: JVM 구조

오라클 JVM
더 자세히!

Class Loader Subsystem

  • class 사용 전 미리 빌려와서 필요한 것 배치, 부팅
  • .class 에서 바이트코드 읽고 메모리에 저장

Runtime Data Area (Memory)

  • 실행 중 사용되는 데이터
  1. Method Area (메소드 영역)
  2. Heap : 객체 저장 (인스턴스 저장)
  3. Stack : 스레드마다 런타임 스택 만들고, 스택 프라임이라 부르는 블록에 쌓음

Execution Engine

  1. JIT Compiler : 반복되는 코드 재사용해서 속도 높임 (캐싱 기능 보유)
  2. GC (Garbage Collection)
    • 더이상 참조되지 않는 객체를 모아서 정리
    • JVM의 가비지 컬렉터가 불필요한 메모리 알아서 정리해줌
  • GC야 우선 뭔지 모르겠지만 고맙다! 고마운 GC

JNI (Java Native Interface)

  • 기본으로 제공되는 메서드에 native 키워드를 가 붙은 친구

네이티브 메소드 라이브러리.

  • C, C++로 작성된 라이브러리

:: Class Loader 와 Static 영역

Class Loader System

  • Loading

    • Class Loader가 .class 파일 읽고 데이터를 Method Area 영역에 저장
    • 메소드 영역에 저장하는 데이터
      • FQCN (Pully Qualified Class Name) : package 포함한 ClaSS 이름
        -> java.lang.String
        -> package명은 Class명과 겹치지 않게 무조건 소문자로만 작성
      • Class | Interface | Enum
      • 메소드와 변수
  • Linking
    참고자료

  • Initialization

    • Static 붙은 것들 초기화, static 블럭 실행
class Practice {
    public static String STATIC_MESSAGE = "응애";

    static {
        System.out.println("I'm Loading");
        System.out.println(STATIC_MESSAGE + "2");
    }

    public static String GET_STATIC_MESSAGE(){
        return STATIC_MESSAGE;
    }
}




public class Main {
    public static void main(String[] args) {
        String staticMessage = Practice.GET_STATIC_MESSAGE();

        System.out.println("Hello");

        System.out.println(staticMessage);
    }

}

:: Runtime Data Area (메모리 영역)

  • Method Area == Static 영역 or Class 영역
  • Stack 영역 == Thread 영역

:: 메모리 이용방식

가장 간략하게 프로그램이 메모리 사용하는 방식

데이터 저장 영역 세분화

  • 스태틱 영역 : 클래스와 static
  • 스택 영역 : 메서드
  • 힙 영역 : 객체(인스턴스)

main(String[] args)

  • java 프로그램 실행하기 위한 진입점
  • 프로그램에 이미 세팅되어 있음
  • 즉 조작이 가능

  1. JRE는 psvm 메서드가 있는지 먼저 찾는다
  2. psvm 존재 == true -> JRE는 JVM 부팅
  3. 부팅된 JVM은 바이트파일(.class) 실행
    • JVM 전처리 java.lang 패키지 로드 : Static 영역에 올림
      -> sout 같은 메서드 쓸 수 있게 되는 것

  4. 작성한 class와 import package Static 영역에 올림

  5. Stack영역에 main() 스택 프레임 올라감

기본메서드 psvm 더 알아보기

:: Execution Engine (실행엔진과 GC)

  1. 실행엔진
  2. Garbage Collector

0개의 댓글