[JAVA]JVM, 메모리 영역

gov's avatar
Nov 12, 2024
[JAVA]JVM, 메모리 영역
  1. JVM 자바가상머신
    1. 자바 프로그램이 실행 되는 가상 환경
      notion image
      • 인터프리터(interpreter)
        • 바이트를 한 줄씩 해석하고 실행하는 프로그램
        • JVM은 바이트코드를 실시간 해석하여 진행
      • JDK (Java Development Kit)
        • 자바 개발 키트. 자바 애플리케이션 개발을 위한 도구 모음
        • 컴파일러(javac), JVM, APL(라이브러리) 등 도구 포함
      • JRE (Java Runtime Environment)
        • 자바 실행 환경
        • 자바 애플리케이션을 실행하려면 JRE만 설치. 자바 애플리케이션을 개발 시 JDK 필요
  1. JVM 이해 코드
    1. JVM > 클래스 로드 > static 찾기 > static main 실행
      public class JvmTest { // 인스턴스 변수 num1 (Heap 저장) int num1 = 1; // 객체 생성될 때 인스턴스 변수 num1 할당 // static 변수 num2 (Static 저장) static int num2 = 2; // 클래스 로딩 시 한 번만 할당, 모든 객체 공유 // method1 메서드 (Stack 메모리 영역에서 호출 시 메모리 할당) void method1(int num3){ // num3은 method1의 매개변수 (Stack 영역) System.out.println("num3: "+num3); // 메서드에 매개변수 num3 출력 int num4 = 4; // num4는 method1의 지역 변수 (Stack 영역) System.out.println("num4: "+num4); // 지역 변수 num4 출력 } public static void main(String[] args) { // main메서드 실행 시 Stack 메모리 영역에 할당 System.out.println("JVM Start"); // 클래스 이름으로 static 변수 접근 (static 영역에 num2 접근) System.out.println("num2: "+JvmTest.num2); // num2는 static 변수로 클래스 레벨에 공유 // JvmTest 객체를 생성 (Heap 메모리에서 객체가 생성됨) JvmTest jt = new JvmTest(); // new JvmTest()는 Heap 메모리에 객체 생성 System.out.println("num1: "+jt.num1); // num1은 객체마다 개별 존재하는 인스턴스 변수 // method1을 호출하고, 매개변수 num3에 값3 넘김 jt.method1(3); // method1 호출 시 num3는 Stack 메모리에 할당된 매개변수 전달 } }
    2. static 정적
        • 클래스 내부에 행위가 있을 때 작성 static 선언된 변수나 메서드는 객체를 생성하지 않고 클래스 이름으로 호출
        • 클래스 실행 시 한 번만 메모리에 적용되고, 프로그램 종료 시 해제
          • 인스턴스 객체 수와 관계없이 하나만 존재
    3. heap 동적
        • static 아닌 것을 호출. new로 객체 생성 시 heap 공간에 생성
          • 객체가 참조되지 않을 때, 메모리 해제
    4. statck 스택
        • 메서드 호출 시 지역 변수와 호출 정보를 저장
          • 마지막 호출된 함수부터 종료
        • 자동 메모리 관리. 메서드 호출이 끝나면 저장한 메모리 자동 해지
    5. queue 큐
        • 선입선출. 첫 번째 들어온 데이터가 첫 번째로 호출
 
사진 출처: 이재환의 자바 프로그래밍 입문
Share article

goho