Development/JAVA
JAVA에서의 메모리
루루지
2023. 2. 14. 22:11
반응형
메모리 구조
애플리케이션에 할당되는 메모리는 내부적으로 여러 영역으로 나뉘는데 그 중 stack, heap 메모리가 있다.
- stack 메모리: 함수나 메서드의 지역 변수(local variable), 매개 변수(parameter) 및 임시 데이터가 저장됨. 함수나 메서드가 호출될 때 마다 스택 프레임이 쌓인다.(메서드 호출이 끝나면 사용한 메모리가 해제된다)
- heap 메모리: 객체가 저장되며, garbage collection의 대상이된다. 메모리 할당 및 해제가 자동으로 이루어짐.
- 메서드 영역: 클래스 정보와 클래스 변수(static variable)등을 저장한다. 모든 스레드에서 공유되며, 프로그램이 시작될 때 생성.
※ 참고 사항
- 메서드는 클래스에 종속되어 있는 것, 함수는 독립적으로 존재하는 것.
- 즉, 자바는 객체지향 언어이기 때문에 함수가 존재하지 않는다. 메서드가 존재
예제1
public class Main {
public static void main(String[] args) {
int num1 = 10;
int num2 = 20;
int result = num1 + num2;
}
}
위와 같은 경우 stack 영역은 아래와 같이 쌓인다.
예제2
public class Main {
public static void main(String[] args) {
Cart cart = new Cart();
action(cart);
int count = cart.get();
}
public static void action(Cart c) {
cart.addCart();
cart.addCart();
}
public class Cart {
private int count = 0;
public void addCart() { count++; }
public int get() { return count; }
}
}
쓰레기 객체(garbage object)
public class Main {
public static void main(String[] args) {
Cart cart = action();
}
public static Cart action(Cart c) {
Cart cart = new Cart();
return new Cart();
}
public class Cart {
private int count = 0;
public void addCart() { count++; }
public int get() { return count; }
}
}
위와 같은 경우, 메인 메서드에서 Cart cart = action();을 수행할때, action() 내부에서 객체 생성을 2번 하게된다.
즉, heap 영역에 count = 0이 서로 다른 영역에 생성이 된다.
실제로 Cart cart = action();으로 메인 메서드의 stack frame에서 바라보는 것은 heap 메모리에서 두번째로 생선된 것만 바라본다.
이런 경우 사용하지 않는 heap 메모리가 쌓인다.
JAVA인 경우 JVM의 garbage collector가 자동으로 정리해준다.