스택이란?
- Stack 에서 heap 영역에 생성된 Object 타입의 데이터들의 참조를 위한 값들이 할당된다.
- 원시 타입(primitive types)( byte, short, int, long, double, float, boolean, char)의 경우 실제 데이터 값이 할당된다.
- 해당 method가 호출 되면 메모리에 할당되고 method가 종료되면 메모리가 해제된다.

Main 메서드 호출이 끝나고 Stack은 후입 선출 구조이기 때문에 아래와 같이 처리된다.
후입 선출 : 가장 최근에 요청된 것을 가장 먼저 처리, 가장 처음에 들어온 요청은 최후에 처리

스택 상태:

힙 이란?
- Heap 영역에는 대체로 생명주기가 긴 데이터가 저장된다.
- 모든 Object type(String, ArrayList, MashMap, Inteter 등등.. ) 데이터가 저장되는 영역이다.
1. m3의 메소드가 호출된다.

2. m3의 str은 초기화를 2번 하는 구조이다. 마지막으로 선언된 str을 reference 하게 된다.

3. Stack에 str라는 이름으로 생성된 변수는 할당된 값을 가지고 있는게 아니라 Heap의 선언된 String을 reference 한다.

4. 위와 같이 Heap에서 String : "크리스입니다"는 unreachable object(어떤 변수도 reference 하고 있지 않는 객체)이다.
5. 참조되지 않은 Data가 Heap에 존재하기 때문에 메모리 누수가 발생한다. 이때 JVM의 GC가 동작하여 unreachable object를 제거한다.


스택 영역 힙 영역 차이점
| 메모리 구분 | 힙 ( Heap ) | 스택 ( Stack ) |
| 역할 | 동적으로 생성된 객체를 저장( m3 ) | 메서드 호출 시 로컬 변수와 호출 정보 저장 |
| 메모리 할당 | 런타임 시 동적 할당 | 메서드 호출 시 자동 할당 |
| 스레드 접근 | 모든 스레드가 공유 | 각 스레드마다 독립적 |
| 관리 방식 | 가비지 컬렉션으로 관리 | 메서드 호출/종료 시 자동 관리 |
| 속도 | 상대적으로 느림 | 상대적으로 빠름 |
문제점
차이점을 자세히 보면 힙영역에서 모든 스레드가 공유를 한다.
간단히 해결할수 있는 방법은 synchronized 키워드나 java.util.concurrent 패키지의 기능을 사용해 동기화를 처리하는 것이 좋습니다. 하지만 이방법도 한계가 있는듯합니다. 그래서 대부분 메시지 큐 서비스를 앞단에 두고 순차적으로 실행합니다.
'Java' 카테고리의 다른 글
| 코딩 컨벤션 (2) | 2024.10.10 |
|---|---|
| [java] Integer 캐싱 (1) | 2024.10.06 |
| [java]클래스가 상태값을 갖는다. (0) | 2024.10.06 |
| ArrayList vs LinkedList 차이 (0) | 2022.02.06 |
| AWS Amazon Linux에서 java11 설치하기 (0) | 2021.09.16 |