[JAVA] 25. JVM 사전 지식

문정준's avatar
Feb 06, 2025
[JAVA] 25. JVM 사전 지식
  1. 변수 (int, double, boolean, String)
  1. static (main이 실행되기 전에 메모리에 로드) : 공간 분리 (class별로 구분)
      • 정적, 하나만 메모리에 로드 가능함
  1. 메서드 (함수) : 4가지 유형
      • 기본 함수 - void (리턴이 없는)
      • 인수가 1개인 함수
      • 인수가 여러 개인 함수
      • 리턴이 있는 함수
 

1. Heap

 
notion image

코드 작성

package jvm; class Student { int no; String name; int age; void show() { System.out.println(no); System.out.println(name); System.out.println(age); System.out.println(); } } public class Heap01 { public static void main(String[] args) { // new가 되면, static이 붙지 않은 모든 변수, 메서드가 heap에 로드됨 Student s1 = new Student(); s1.no = 1; s1.name = "홍길동"; s1.age = 20; s1.show(); Student s2 = new Student(); s2.no = 2; s2.name = "철수"; s2.age = 16; s2.show(); } }
 
  • class 내부의 객체를 static으로 선언하면, class는 하나밖에 로드할 수 없음
    • class를 여러 번 호출하려면 static이 제거되야 함
    • new 클래스명(); : class를 동적으로 호출, heap에 저장
      • 이때, 호출한 클래스를 변수로 지정하기 위해 클래스명을 타입으로 사용
      • 클래스명 변수명 = new 클래스명();
    • 동적으로 호출한 class는 여러 번 호출 가능
 

결과

notion image

2. Stack

 
notion image
Main Body가 pop = 자바 프로그램 종료

코드 작성

package jvm; public class Stack01 { static void m1() { int a = 1; m2(); } static void m2() { int b = 1; } public static void main(String[] args) { System.out.println("10번 라인"); m1(); System.out.println("12번 라인"); } }
Stack Logic (FILO)
  1. main 실행
  1. m1 호출
    1. a = 1 초기화 (저장)
  1. m2 호출
    1. b = 1 초기화 (저장)
  1. m2 종료
  1. m1 종료
  1. main 종료
 

결과

notion image

스택 오버플로우

package jvm; public class Stack02 { static void m1() { int a = 1; m1(); // 재귀 함수 (Daemon) } public static void main(String[] args) { m1(); } }
Stack Overflow : Stack에 담을 수 있는 최대 용량을 넘어서 저장할 경우 오류 발생
  • 위의 예시는 재귀함수를 통한 무한 호출로 인해 오류 발생

3. Queue

notion image
Stack vs Queue
Stack : FILO (First In Last Out), 변수 저장 공간
Queue : FIFO (First In First Out), 행위의 순서 저장
 

코드 작성

package jvm; public class Queue01 { static void m1() { int n1 = 1; System.out.println("🚒️"); System.out.println("🏍️"); System.out.println("️🚲"); m2(); System.out.println("🚅️"); System.out.println("✈️"); } static void m2() { int n2 = 2; System.out.println("🍕"); System.out.println("🍔"); System.out.println("🌭"); System.out.println("🥚"); System.out.println("🧀"); } public static void main(String[] args) { // order : "main 시작" > m1 호출 = n1 생성 > 소방차, 오토바이, 자전거 출력 > m2 호출 = n2 생성 > // 피자, 햄버거, 핫도그, 계란, 치즈 출력 > m2 종료 = n2 삭제 > 기차, 비행기 출력 > m1 종료 = n1 삭제 > "main 종료" > 종료 System.out.println("main 시작"); m1(); System.out.println("main 종료"); } }
 
코드의 JVM Logic
  1. main stack 생성
  1. main queue 생성
    1. 25번 pop
    2. 26번 pop과 동시에 m1 호출
  1. m1 stack 생성
  1. m1 queue 생성
    1. 6번 pop : m1에 n1 = 1 저장 (4Byte)
    2. 7번 pop
    3. 8번 pop
    4. 9번 pop
    5. 10번 pop과 동시에 m2 호출
  1. m2 stack 생성
  1. m2 queue 생성
    1. 16번 pop : m2에 n2 = 2 저장 (4Byte)
    2. 17번 pop
    3. 18번 pop
    4. 19번 pop
    5. 20번 pop
    6. 21번 pop = end
  1. m2 queue 삭제
  1. m2 stack 삭제, 10번으로 복귀
    1. 10번 pop
    2. 11번 pop
    3. 12번 pop = end
  1. m1 queue 삭제
  1. m1 stack 삭제, 26번으로 복귀
    1. 26번 pop
    2. 27번 pop = end
  1. main queue 삭제
  1. main stack 삭제 = 프로그램 종료
 
notion image
 

결과

notion image
 
내용 정리
  1. Heap : main이 실행된 이후 호출한 클래스가 저장되는 공간
      • main 이전에 실행 : static - 하나만 로드 가능
  1. Stack : 변수를 저장하는 저장 공간, FILO
  1. Queue : 클래스 내에서 메서드(함수) = 행위의 순서저장하는 공간, FIFO
      • Queue는 변수를 저장하지 않음!
  1. Queue는 모든 행위가 pop되어야만 제거, Stack은 저장 공간이 사용되지 않을 경우 제거
      • Stack이 push되면 Queue가 자동 생성, Queue가 제거되어도 Stack에서 사용하는 변수가 존재할 경우 Stack은 pop되지 않음
  1. Stack or Queue가 pop되고 삭제되면, 함수가 호출되었던 곳으로 return
Share article

sxias