[JAVA] 자바의 메모리 구조

FE.1·2023년 11월 6일
0
post-thumbnail

📍 일반변수와 레퍼런스 변수

일반변수

  • 컴파일 시점에서 크기가 정해져 있는 것

  • 값을 가지고 있다.

레퍼런스 변수

  • 컴파일 시점에서 크기가 정해져 있지 않는 것

  • 컴파일 시점에서는 크기를 알 수 없고, 컴파일 후(.class) JVM에 실행했을 때 크기를 알 수 있다.

    • 해당 자료형이 8Byte인지 100Byte인지 5000Byte인지는 실행 전에는 알 수 없다. (동적 할당)
    • 그래서 메모리 Stack 공간에 일단 4Byte를 할당해두고, 해당 Heap 주소를 저장해둔다.
  • 주소를 가지고 있다.

예시 코드

// new가 되어서 힙에 할당이 될 때 사이즈를 알 수 있다. (프로그램이 실행되었을 때 = 런타임)
class MyData {
	int id = 1; // 4byte
	int price = 1000; // 4byte
}

// 레퍼런스 변수, 일반 변수
public class VarRefEx01 {

	public static void main(String[] args) {
		// 타입 변수; -> 변수를 선언한다.
		// 타입 변수 = 값; -> 변수를 초기화(메모리에 할당)한다.
		int num = 10; // 일반 변수 (크기가 정해져 있는 것 = 컴파일 시점)
		MyData d; // 레퍼런스 변수 (크기가 정해져 있지 않는 것 = 컴파일 시점)
	}
}

📍 메서드 Stack 메모리

다음과 같은 코드가 있다. 실재 메모리에 어떻게 로드가 되는지 동작 원리를 확인해보자

3	public class StackEx01 {

5		 static void a() {
6			 StackEx01.b(); // b() 호출
7			 System.out.println("a2");
8			 System.out.println("a3");
9		 	 System.out.println("a4");
10		}

12		static void b() {
13			System.out.println("b1");
14			System.out.println("b2");
15			System.out.println("b3");
16		}

18		public static void main(String[] args) {
19			System.out.println("m1");
20			System.out.println("m2");
21			StackEx01.a(); // a() 호출
22			System.out.println("m4");
23			System.out.println("m5");
24		}

26	}

  • main() 실행 시 Queue와 Stack에 동시에 main 관련 영역을 메모리에 차지한다.
  • 실행을 마친 Stack 영역의 메서드는 POP으로 반환된다.

실행 순서

지역 변수와 전역 변수

  1. Stack
    • 지역 변수
    • 메서드가 실행될 때 메모리에 할당된다.
    • 메서드가 종료될 때 메모리에서 사라진다.
  2. Heap
    • 전역 변수
    • new 연산자를 사용할 때 메모리에 할당된다.
    • 더 이상 참조하지 않을 때 메모리에서 사라진다.
  3. Static
    • 전역 변수
    • main 메서드가 실행되기 전에 메모리에 할당된다.
    • main 메서드가 종료되면 메모리에서 사라진다.
profile
공부하자!

0개의 댓글