지난번에 메모리 누수때문에 메모리에 관련된 공부를 많이 했었는데, 그때 귀찮아서 정리하지 않았던 부분을 오늘 정리해보려고합니다.
JAVA 메모리 영역이란?
JAVA 프로그램은 JVM(Java Virtual Machine)을 사용하여 실행됩니다. 이때 JVM은 프로그램을 실행하면서 메모리를 할당하고 사용합니다. JVM이 할당하는 메모리 영역은 크게 3가지로 나눌 수 있습니다.
1. 메소드 영역(Method Area)
메소드 영역은 클래스 정보를 저장하는 영역입니다. 클래스 정보란 클래스 이름, 상수 풀(Constant Pool), 필드 정보(Field), 메소드 정보(Method) 등을 말합니다. 이 영역은 JVM이 시작될 때 생성되며, 모든 스레드가 공유합니다.
2. 힙 영역(Heap)
힙 영역은 객체를 저장하는 영역입니다. new 연산자로 생성된 객체와 배열이 여기에 저장됩니다. 이 영역은 JVM이 시작될 때 생성되며, 모든 스레드가 공유합니다. 힙 영역은 크게 Young 영역, Old 영역, Perm 영역으로 나뉘며, 각 영역마다 특성이 다릅니다.
3. 스택 영역(Stack)
스택 영역은 메소드 호출 시 지역변수와 매개변수를 저장하는 영역입니다. 메소드가 호출될 때마다 각각의 스택 프레임(Stack Frame)이 생성되며, 메소드가 종료될 때 해당 스택 프레임이 제거됩니다. 스택 영역은 스레드마다 별도로 존재합니다.
메모리 영역의 특성
메모리 영역은 각각의 역할과 특성이 다르므로 메모리 관리 측면에서 중요한 역할을 합니다. 따라서 프로그래머는 이를 이해하고 적절하게 메모리를 할당하고 사용해야 합니다. 각 영역의 특성을 간단히 살펴보면 다음과 같습니다.
메소드 영역(Method Area)
- 클래스 정보를 저장하는 영역
- JVM이 시작될 때 생성됨
- 모든 스레드가 공유함
힙 영역(Heap)
- 객체를 저장하는 영역
- JVM이 시작될 때 생성됨
- 모든 스레드가 공유함
- 크게 Young 영역, Old 영역, Perm 영역으로 나뉨
여기서 한가지 알아두어야 할것은 GC(Garbage Collection)이 Young영역에 있는것을 지울때는 어플리케이션이 멈추지 않지만 Old영역에 쌓여서 Full GC가 발생하게 되면 JAVA 어플리케이션이 멈추게 된다. 이 부분을 조심해야 한다. 항상 메모리 영역을 신경을 쓰면서 개발을 해야한다.
그리고 추가적으로 공부하면서 알게된것은 JAVA의 변수는 기본적으로 Stack영역에 할당되고, 해당 변수에 저장된 값은 Heap영역에 할당됩니다. 일하면서 메모리 이슈가 나지않았다면, 이 부분을 자세히 찾아보진 않았을것 같습니다. 저는 항상 일하면서 공부하고 배우는 스타일인거 같습니다.
'JAVA' 카테고리의 다른 글
Web 채팅 프로그램 만들기 (1) | 2023.06.19 |
---|---|
함수형 프로그래밍(Functional Programming) 이란? (3) | 2023.05.21 |
[JAVA] - try(){}, Try-with-resources 란? (1) | 2022.11.07 |
댓글