데브림의 블로그 포스팅 한 것들을 한 눈에 확인하고 싶다면 클릭!
👉 https://github.com/DevLimK1/tistory-map 👈
Java의 JVM이 사용하는 메모리 영역에 대해서 알아보도록 하겠다.
Runtime Data Area 에서 메소드, 힙, JVM 스택 영역 한 눈에 살펴보기 👀
😀 java.exe로 JVM이 시작되면 JVM은 운영체제에서 할당받은 메모리 영역인 Runtime Data Area를
메소드 영역, 힙 영역, JVM 스택 영역으로 구분해서 사용한다.
1) 메소드(Method) 영역
- 컴파일 된 바이트코드인 클래스(~.class)들을 클래스 로더로 읽어서 클래스별로 런타임 상수풀, 필드/메소드 데이터, 메소드 코드, 생성자 코드 등을 분류해서 저장
- JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역
2) 힙(Heap) 영역
- 객체와 배열이 생성되는 영역
- JVM 스택 영역의 변수나 다른 객체의 필드에서 참조
- 참조하는 변수나 필드가 없다면 쓰레기 수집기(Garbage Collector, GC)를 실행시켜서 쓰레기 객체를 힙 영역에서 자동으로 제거
- 이는 C/C++ 언어와 다르게 개발자가 따로 객체를 제거하는 코드를 작성할 필요가 없음
3) JVM 스택(Stack) 영역
- 각 스레드마다 하나씩 존재하며 스레드가 시작될 때 할당됨
- 자바 프로그램에서 추가적인 스레드를 생성하지 않았을 때는 main 스레드만 존재하므로 JVM 스택도 하나임
- 메소드를 호출할 때마다 프레임(Frame)을 추가(push)하고 메소드가 종료되면 해당 프레임을 제거(pop)
- scope 영역
- 프레임 내부에는 로컬 변수 스택이 있는데, 기본 타입 변수와 참조 타입 변수가 추가(push) 되거나 제거(pop) 됨
★기본 타입 변수는 스택 영역에 직접 값을 가지고 있지만, 참조 타입 변수는 값이 아니라 힙 영역이나 메소드 영역의 객체 주소를 가진다. 다음 코드를 통해 이해해보자.
int val=5; //기본 타입 변수
int[] arr = {10,20,30}; //참조 타입변수, 자바에서는 배열을 객체로 취급
마무리✍
😀 자바 개발자라면 자바의 메모리가 어떻게 저장되고, 사용되는지 아는 것은 중요하다고 생각한다.
깊게 알지는 못하더라도 위 정도의 기본 메모리 구조에 대해서는 필히 알아야겠다.
다음에는 가비지 컬렉터(Garbage Collector,GC) 에 대해서도 포스팅을 해보도록 하겠다.
여담이지만, 좀 더 포스팅을 효율적으로 해보고자 타블렛을 사봤는데, 아직은 유용한지 잘 모르겠다😅
(위에서 메모리 구조 그림 그릴 때 push, pop 부분은 괜히 타블렛 펜 사용해보고 싶어서 살짝 그려봤습니다🤣)
참고)
이것이 자바다(신용권 저)
긴 글 끝까지 읽어주셔서 감사합니다 : )
TIL 포스팅은 스스로 습득한 지식과
강의, 블로그, 서적 등을 참고해서이해한 것을 바탕으로 정보를 공유합니다.
포스팅에 문제가 있거나, 수정이 필요한 부분 , 질문이 있으시면 댓글 남겨주세요.
도움이 되셨다면 공감(♥)버튼, 댓글은 작성자에게 큰 힘이 됩니다.
댓글