My Space

반응형

메모리 구조

애플리케이션에 할당되는 메모리는 내부적으로 여러 영역으로 나뉘는데 그 중 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가 자동으로 정리해준다.

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading