본문 바로가기
Programming/Languages (Java, etc)

[JAVA] stack, heap (스택과 힙) 메모리 런타임

by kghworks 2022. 1. 26.

목차

  • 자바의 메모리 영역
  • 스택 (stack)
  • 힙 (heap)
  • 가비지 컬렉션 (Gabage Collection)

자바의 메모리 영역

 

java의 메모리구조

자바의 메모리 구조는 크게 스택으로 나뉩니다. 


스택 (stack)

 

  • 기본 타입 (long, int, boolean,...)은 값을 실제로 저장
  • heap에 저장된 객체 (object 타입)의 주소값을 저장
  • scope 별 stack 영역 할당
  • 스레드 별 독립적인 stack 할당

 

스택의 동작 과정은 간단히 다음과 같습니다.

public class Test {
    public static void main(String[] args) {
        int arg = 2; /*1*/
        arg = plusOne(argument); /*4, 5*/
    }

    private static int plusOne(int param /*2*/) {
        int tmp = param + 1; /*3*/
        return tmp;
    }
}

stack 동작 과정

 

  1. arg 할당
  2. plusOne() 실행, 스택에서 plusOne() scope 영역 할당
  3. temp 할당
  4. plusOne()종료
  5. arg 재할당

힙 (heap)

 

  • heap의 개수는 1개 (스레드 개수와 무관)
  • object 타입(List, Integer, new Person(),...)의 데이터가 저장
  • object 타입의 레퍼런스 변수는 stack에 저장

 

힙의 동작 과정은 간단히 다음과 같습니다.

public class Test {
    public static void main(String[] args) {
        int port = 8080;
        String host = "localhost";
    }
}

heap의 작동과정

* String pool에 대해서는 String object에 대한 아래 포스팅에서 더 자세히 다루었습니다.

2022.01.28 - [개발/JAVA] - String 데이터 타입, String pool

 

String 데이터 타입, String pool

목차 String 객체 String Interning literal vs new String() 참조 String 객체 String 데이터 타입은 기본형이 아니라 객체입니다. 따라서 Stack에 값이 바로 저장되지 않고 Heap영역에 저장되고, 그 주소 값을..

kghworks.tistory.com


가비지 컬렉션 (Gabage Collection)

아래 코드에 한 줄을 더 추가해봅시다.

public class Test {
    public static void main(String[] args) {
        int port = 8080;
        String host = "localhost";
        host+=".kghworks"; //추가
    }
}

 

그럼 아래와 같이 동작합니다.

String pool에 stack으로부터 어떤 참조도 받지 않는 "localhost" 데이터가 있습니다. 이 데이터는 쓸모가 없는데 어떻게 해야 할까요?

 

이렇게 stack으로부터 아무 참조도 받지 않는 heap의 object를 unreachable object라고 하고, 이 것들을 메모리에서 삭제하는 것을 가비지 컬렉션이 일어났다고 합니다. 이 일을 하는 것이 JVM의 가비지 컬렉터 (Gabage Collector)입니다.

 

가비지 컬렉션 (이하 GC)은 아래와 같은 절차로 동작합니다.

 

  1. stop the world
  2. Mark and Sweep

 

stop the world

GC를 위해 JVM은 실행 중인 애플리케이션을 모두 멈춥니다. GC를 실행하는 스레드 외에 모든 스레드가 멈추고 GC가 종료된 후에 스레드들이 다시 실행됩니다. GC 성능을 튜닝한다는 것은 보통 stop the world 시간을 줄이는 작업을 말합니다. 

 

마크 (Mark)

JVM의 가비지 컬렉터가 스택의 모든 변수를 확인하여 어떤 객체들을 참조하고 있는지 확인하는 것입니다.

참조가 되어있는 변수에만 마킹합니다.

 

스윕 (Sweep)

마크되어있지 않은 모든 객체들을 제거하는 것입니다.

실제로는 마크되어있지 않은 객체들을 일일이 찾지 않고, 마킹 작업 후 마킹되지 않은 객체를 한 번에 지워버립니다.

 

GC에 대해서는 여기까지만 포스팅하고 아래 포스팅에서 GC에 대해서만 자세히 설명하도록 하겠습니다.

 

2022.02.16 - [개발/JAVA] - Garbage Collection (가비지 컬렉션)

 

Garbage Collection (가비지 컬렉션)

목차 JVM 가상 머신의 메모리 관리 Garbage Collection GC 동작 예시 (코드) GC 원리 (메모리) GC의 종류 참고 * 주의사항 : JAVA의 메모리 원리에 대해 안다는 전제 하에 포스팅합니다. stack과 heap에 대한 최

kghworks.tistory.com

 

댓글