JAVA

[Java] 메모리 관리 - 스택, 힙, Garbage Collection

lakelight 2022. 7. 21. 13:55
728x90
반응형

Stack 영역

  • Heap 영역에 생성된 객체 타입의 데이터들에 대한 참조를 위한 값들이 할당됩니다.
  • 원시타입(Primitive Types) - byte, short, int, long, double, float, boolean, char 타입의 데이터들이 할당됩니다.
    원시 타입은 참조값이 저장되는 것이 아니라 실제 값이 저장됩니다.
  • 스택에 있는 변수들은 visibility를 가집니다. 변수 Scope에 대한 개념입니다. 지역변수는 함수 내에 있을 때 Stack 영역에 저장 된 후 함수가 종료되는 시점에 Stack에 저장된 모든 변수들이 pop되어 사라집니다.
  • 각 쓰레드는 자신만의 Stack을 가집니다.

Stack 예시

원시 타입 지역변수 저장

public class Main {
    public static void main(String[] args) {
        int a = 100; //Stack 메모리에 저장
        int b = 200; //Stack 메모리에 저장

        System.out.println("a = " + a);
        System.out.println("b = " + b);
    }
}

위에 코드가 실행되었을 때 Stack 상태

지역변수 Scope에 따른 Stack 저장

public class Main {
    public static void main(String[] args) {
        int a = 100; //Stack 메모리에 저장
        int b = 200; //Stack 메모리에 저장

        System.out.println("a = " + a);
        System.out.println("b = " + b);
    }
    
    static void func(){
        int c = 200;
        System.out.println("c = " + c);
    }
}

func가 실행되면 c가 Stack 메모리에 들어오고 func가 끝나면 pop되어 사라집니다.


Heap 영역

  • 주로 긴 생명주기를 가지는 데이터들이 저장됩니다.
  • 애플리케이션의 모든 메모리 중에서 Stack에 있는 데이터를 제외한 부분이라고 보면 됩니다.
  • 모든 Object 타입(Integer, String, ArrayList etc.)이 저장됩니다.
  • 몇개의 스레드가 존재하든 상관없이 단 하나의 heap 영역만 존재합니다.
  • Heap 영역에 있는 Object 들을 가리키는 참조 변수가 Stack에 저장됩니다.

Heap 예시

object 타입 변수 저장 (stack, heap)

public class Main {
    public static void main(String[] args) {
        String input = "입력";
        String output = "출력";

        System.out.println("input = " + input);
        System.out.println("output = " + output);
    }
}

Stack에 참조값이 저장되고 실제 값은 Heap에 저장됩니다.

List 저장 (stack, heap)

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(3);
        list.add(2);
        for (Integer integer : list) {
            System.out.println("integer = " + integer);
        }
    }
}

List가 Stack과 Heap에 저장되는 구조


Garbage Collection

public class Main {
    public static void main(String[] args) {
        String info = "Hi";
        info += "My name is Lakelight";
        System.out.println("info = " + info);
    }
}

String은 불변 객체이므로 더하기 연산이 수행된 결과새롭게 Heap 영역에 할당하게 됩니다. 그렇게 되면 원래 있던 객체인 Hi 객체가 참조되는 변수가 없으므로 Unreachable 객체가 됩니다. 이때 JVM의 Garbage Collector Unreachable 객체를 우선적으로 메모리에서 제거하여 메모리 공간을 확보합니다.

기존에 있던 "HI"객체 참조 변수가 없는 Unreachable 객체가 되고 Garbage Collection 대상이 됩니다.

 

결론

Java 메모리 구조에 대해서 알아보았습니다. Stack과 Heap을 알아보았고, Garbage Collection에 대해서도 알게되었습니다.
다음에는 Java 메모리 구조에 대해서 누가 물어본다면 잘 설명할 수 있을 것입니다. 포스팅 봐주셔서 감사합니다.

 

[참고]

1. 자바 메모리 관리 - 스택 & 힙

728x90
반응형

'JAVA' 카테고리의 다른 글

[Java] Decorator Pattern  (0) 2022.07.28
[Java] Template Method Pattern  (0) 2022.07.28
[Java] Singleton Pattern  (0) 2022.07.28
[Java] 자바 메서드가 생성되는 원리 - 가상 함수 기법  (0) 2022.07.28
[Java] 제네릭 타입  (0) 2022.07.20