유튜브 채널 쉬운코드의 메모리 관련 영상을 정리해보았다.
runtime이란?
어플리케이션이 메모리에 올라가 실행중인 상태
Stack
메서드의 지역변수, 매개변수가 저장되는 공간. 스택 프레임의 형태로 저장되고 메서드가 호출될 때 생성된다.
생성자가 호출될 때도 스택 메모리에 스택프레임이 쌓인다.
스택메모리에 정해진 용량보다 스택 프레임이 쌓이는 정도가 넘어가면 StackOverflow 에러가 발생한다.
재귀함수에서종종 발생한다.
Heap
객체가 저장되는 공간.
어플리케이션이 동작할 때 Stack, Heap에서는 무슨 일이?
public class Main {
public static void main(String[] args){
Counter c = new Counter();
two(c);
int count = c.get();
}
public static void two(Counter c){
c.increment();
c.increment();
}
}
public class Counter{
private int state = 0;
public void increment(){ state++; }
public int get() { return state; }
}
아래 이미지와 같이 메소드 호출 시 각 스택프레임이 쌓이고 new Counter()로 생성된 객체는 heap메모리에 생성되고 스택 프레임에는 해당 주소값이 할당된다. 즉 two(c)로 넘어간 매개변수는 heap메모리에 있는 객체의 주소값이 되고 two()에서 호출한 c.increment()는 주소값이 가리키고 있는 객체의 인스턴스 변수 state를 증가시킨다.
'Java' 카테고리의 다른 글
서블릿 컨텍스트 (0) | 2023.12.06 |
---|---|
인터페이스와 추상 클래스 (0) | 2023.11.30 |
동등성과 동일성에 대해 (0) | 2023.11.30 |
String의 equals와 compareTo 메서드 비교 (0) | 2023.11.30 |
JAVA에서 정렬하는 방법 (0) | 2023.11.30 |