JVM 실행 시 저장 진행 상황(Static, Heap, Stack)

JVM 실행 시 저장 진행 상황(Static, Heap, Stack)
muaga's avatar
Apr 30, 2024
JVM 실행 시 저장 진행 상황(Static, Heap, Stack)

코드


 
package exam; class 엘리스 { static String name = "엘리스"; int height = 160; void eat(int qty) { this.height = this.height + (10 * qty); } } public class Alice { public static void main(String[] args) { 엘리스 e = new 엘리스(); e.eat(5); System.out.println(e.height); } }
 

진행 상황


1. 클래스 로드 및 Static 로드

1.1 클래스 로드

Static 변수와 클래스의 구조를 읽어온다.
 

1.2. Static 로드

해당 Static 변수와 메소드가 할당되며, Static 변수가 로드 한다.
  • class 앨리스 : static String name = "엘리스"
  • class Alice : static void main(String[] args)
 

2. Main 메소드 실행 및 Stack 생성

2.1. Main 메소드 실행

아래의 Main 메소드 조건에 부합하면, JVM은 Main 메소드를 실행한다.
  • 조건
    • public
    • static
    • 메소드 이름 = Main
 

2.2. Stack과 Queue 생성

 

3. Heap 생성 및 객체 참조

3.1. Heap 생성

  • new 엘리스( ); ➡️ Heap 생성
 

3.2. Heap에 데이터 저장

  • Heap의 아무 공간에 엘리스(class 명) 타입으로 height = 160 / eat인 인스턴스가 생성된다.
  • Heap은 객체 데이터를 저장하고, JVM이 이를 관리한다.
 

3.3. stack에 참조 변수 생성

Stack의 변수는 실제 데이터 대신, Heap에 있는 객체의 참조(주소)를 저장한다.
  • Stack의 공간 용량은 알 수 없기 때문에 값을 저장하지 않고, 정확한 데이터의 용량만 저장한다.
  • 엘리스 e ➡️ Main의 Stack 실행
    • stack에 앨리스 e가 만들어 지며, 위의 heap에 저장된 height = 160 / eat의 주소를 저장한다. 👉 heap의 저장 위치 주소
    • , 포인터를 표시한다.
 
❔ new
  • new의 저장 공간은 4byte이다. 주소만 저장함으로써 stack에는 4byte만 저장하고 그 주소로 heap에 저장된 값을 사용한다. 일정하지 않은 데이터는 heap에 저장한다.
  • new는 참조 변수, 레퍼런스 변수라고 한다.
 

4. 메소드 호출 및 데이터 조작

4.1. 메소드 호출

  • e.eat(5) 호출 ➡️ Stack에 저장'eat' 메소드에 대한 호출 정보와 인자 값 qty=5가 저장된다.
 

4.2 Heap의 데이터 변경

  • e.eat(5) 실행 ➡️ Heap 데이터 수정 메소드 내에서 this.height += 10 * qty는 this가 가리키는 객체(e)의 height 속성을 변경한다.
 


  • Static 메모리
    • Static 메모리는 공유 메모리라고 한다. new로 호출할 필요 없어 static은 한번만 뜨면 어디서든 사용이 가능하기 때문이다.예) class명.name
    • 메소드가 실행하기 전의 Main의 Stack에 Static 메모리는 이미 존재하지만, 그 안의 변수(함수)는 실행이 되어야 존재해진다.
  • Stack의 접근
    • Stack은 다른 Stack에 접근이 불가능하다.
    • Stack은 같은 Class 내 Heap에 접근이 가능하다.
    • stack이 다른 곳에서 값을 불러오고 싶으면 return이나 자기 class에서 그 값을 heap에 저장해야 한다.
Share article

muaga's Hub