JVM?
JVM(Java Virtual Machine)은 OS의 메모리 영역에 접근하여 Java의 메모리를 관리하는 가상의 프로그램을 의미한다.
C 또는 C++로 개발할 때는 사용자가 직접 메모리를 관리해주어야 한다. C 에서는 calloc, realloc, malloc 같은 것으로 메모리를 할당하여 쓰고난뒤 free로 해제를 직접 해줘야 하고, C++ 에서는 생성자와 소멸자를 이용하여 메모리를 관리해야 한다. 하지만 Java에서는 JVM이 Stack과 Heap이라는 메모리 관리하여 객체들을 할당하고 해제하며, GC(Garbage Collection)을 통해 사용하지 않는 객체들은 자동으로 해제하여 메모리를 관리한다.
Stack & Heap
1. 스택(Stack)
Stack은 정적으로 할당된 메모리(Static Memory Allocation) 영역이다.
Stack에서는 Primitive type (byte, short, int, long, float, double, char, boolean) 방식의 데이터가 값과 함께 할당되며 Heap 영역에 생성된 Object type의 데이터의 참조 값이 할당 된다. Stack은 각각의 스레드마다 별도로 생성되며, 스레드의 메서드 호출과 관련된 정보를 저장한다. 일반적으로 Stack의 크기는 고정되어 있으며, Stack Overflow(최대용량 초과)가 발생할 수 있다.
2. 힙(Heap)
Heap은 동적으로 할당된 메모리(Dynamic Memory Allocation) 영역이다.
Heap에서는 모든 Object 타입의 데이터가 할당된다. 프로그램 실행 중에 런타임 시간에 생성되는 객체를 저장하며, 이 객체들은 프로그램의 생명 주기 동안 유지된다. 프로그램 전체에서 공유되는 메모리 영역이기 때문에 여러 스레드가 동시에 접근할 수 있다. 동적으로 할당된 메모리는 사용 후에 명시적으로 해제해주어야 한다.
따라서,
Stack은 주로 간단한 값 타입의 데이터나 객체 참조를 저장하는데 사용되고, Heap은 주로 복잡한 객체나 배열 등이 저장되는 영역이다. Stack 메모리는 자동으로 관리되는 반면 Heap 메모리는 직접 관리해야 한다.
'Java' 카테고리의 다른 글
[Java] 오버로딩 & 오버라이딩(Overloading & Overriding) (0) | 2024.04.09 |
---|---|
[Java] 생성자(Constructor) (0) | 2024.03.31 |
[Java] Getter&Setter (0) | 2024.03.31 |
[Java] 접근 제어자(Access Modifiers) (0) | 2024.03.26 |
[Java] 삼항 연산자(조건 연산자) (0) | 2024.03.18 |