Java/TIL(Today I Learned)

[JAVA_TIL] 자바(java) 메모리 사용 영역(Runtime Data Area)인 메소드(Method) 영역 , 힙(Heap) 영역 , JVM 스택(Stack) 영역에 대해 이해해보기

림케이원 2020. 8. 9.

데브림의 블로그 포스팅 한 것들을 한 눈에 확인하고 싶다면 클릭!

👉 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 포스팅은 스스로 습득한 지식과
강의, 블로그, 서적 등을 참고해서이해한 것을 바탕으로 정보를 공유합니다. 

포스팅에 문제가 있거나, 수정이 필요한 부분 , 질문이 있으시면 댓글 남겨주세요.

도움이 되셨다면 공감()버튼, 댓글은 작성자에게 큰 힘이 됩니다.

댓글