본문 바로가기
JAVA/이재환의 자바 프로그래밍 입문

[Java] Ch.10 자바의 메모리 모델

by ♡˖GYURI˖♡ 2023. 10. 17.

메서드 영역

프로그램 실행에 대한 코드, 스태틱 변수 및 메서드, 런타임 상수 풀이 메서드 영역에 생성됨

이 영역에 저장된 내용은 프로그램 시작 전에 로드되고 프로그램 종료 시 소멸됨

런타임 상수 풀(runtime constant pool)에는 컴파일 타임에 알려진 숫자 리터럴부터 런타임에 확인되어야하는 메서드 및 필드 참조에 이르기까지 여러 종류의 상수가 포함된

 

스택 영역

메서드가 호출되면 지역 변수, 매개변수가 프레임 형태로 생성되어 스택 영역으로 쌓였다가 사라짐

이 때 프레임 형태를 불투명한 빈 박스로 이해하면 됨

하나의 박스 안에서는 다른 박스 안의 내용을 알 수 없기에 프레임 영역을 벗어난 다른 메서드의 변수들은 서로 참조할 수 없음

 

힙 영역

클래스의 객체(인스턴스), 배열이 new 연산자에 의해 힙 영역에 동적으로 생성됨

생성된 객체는 자동 저장소 관리 시스템인 가비지 컬렉터(garbage collector)에 의해 사용이 없음이 확인되면 자동으로 제거 됨

C/C++와 달리 자바에서는 자동으로 메모리 관리를 해줌

 

 

디버그 모드

[F5] Step Into : 메서드가 있으면 그 메서드 내부 코드로 진입

[F6] Step Over : 메서드를 만나면 메서드 내부 코드로 진입하지 않고 결과만 반환받아 실행한 뒤 다음 줄로 넘어감

 

public class Ex01_MemoryInStack
{
	public static void main(String[] args)
	{
		int num1 = 10;
		int num2 = 20;
		adder(num1, num2);
		System.out.println("-----------------------");
	}
	public static int adder(int n1, int n2)
	{
		int result = n1 + n2;
		return result;
	}
}

 

public class Book
{
	int num;
}
public class MemoryInHeap1
{

	public static void main(String[] args)
	{
		Book book1 = new Book();
		Book book2 = new Book();
		
		book1.num = 10;
		book2.num = 20;
		
		System.out.println(book1.num);
		System.out.println(book2.num);
		
		book1 = null;
		book2 = null;
	}

}

 

 

가비지 컬렉션(garbage collection)

가비지 컬렉션이 수행되는 동안에는 모든 스레드가 멈추게 됨

가비지 컬렉션 강제 발생 : System.gc();

반드시 객체의 소멸을 이끄는 finalize() 메서드가 반드시 호출되기 원한다면 코드를 추가 삽입 : System.runFinalization();

 

 

public class MemoryInHeap2
{

	public static void main(String[] args)
	{
		Book book1 = new Book();
		book1.num = 10;
		
		Book book2 = book1;
		
		System.out.println("book1.num : " + book1.num);
		System.out.println("book2.num : " + book2.num);
		System.out.println("-----------------------------------------------");
		
		book2.num = 20;
		
		System.out.println("book1.num : " + book1.num);
		System.out.println("book2.num : " + book2.num);

	}

}