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 영역은 아래와 같이 쌓인다.

메서드가 종료되면 stack frame가 삭제된다

 

예제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가 자동으로 정리해준다.