메서드 영역
프로그램 실행에 대한 코드, 스태틱 변수 및 메서드, 런타임 상수 풀이 메서드 영역에 생성됨
이 영역에 저장된 내용은 프로그램 시작 전에 로드되고 프로그램 종료 시 소멸됨
런타임 상수 풀(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);
}
}
'JAVA > 이재환의 자바 프로그래밍 입문' 카테고리의 다른 글
[Java] Ch.12 클래스의 상속 (0) | 2023.10.20 |
---|---|
[Java] Ch.11 스태틱의 이해 (1) | 2023.10.20 |
[Java] Ch.9 클래스의 기초 (1) | 2023.10.17 |
[Java] Ch.8 계산기 만들기 (0) | 2023.10.16 |
[Java] Ch.7 메서드와 변수의 사용 가능 범위 (0) | 2023.10.16 |