이번에 정리할 내용은 자바에서 메모리를 어떻게 관리하는지에 대해서이다. 그 전에 첫번째 정리에서 JVM에 대해서 공부하면서 메모리 영역에 대해 간단하게 알아보았다. 따라서 아래 링크를 통해 한 번 복습하고 나서 읽어보면 더 좋을 거 같다.
먼저 의문이 든 점을 해소하고 가보고자 한다. 우리는 단순히 코드 작성해서 원하는 결과값만 얻으면 장땡이지 않나 생각할 수 있다. 따라서 왜 프로그램의 메모리를 고려해야하는지에 대해 알아보자.
이 부분 역시 JVM에 대해 공부하면서 알아봤지만 한번 더 알아보자.
.java
), 즉 우리가 작성한 파일을 Java Compiler를 통해 바이트 코드(.Class
) 파일로 변환자바의 메모리 구조는 아래 그림과 같다.
자바의 메모리는 크게 stack과 heap 두 파트로 나누어진다
스택 프레임(혹은 Activation Record)을 저장하는 메모리 공간이다.
스택 프레임은 메서드가 호출되기 이전의 상태를 기록하는 역할을 수행하며 다음과 같은 내용을 포함한다.
매개 변수(Parameter) : 호출 메서드가 전달한 인자 값
지역 변수(Local Variables) : 메서드 내에서 선언한 변수
리턴 주소(Return Address) : 메서드 실행을 마친 다음 실행할 명령문의 주소
리턴 값(Return Value) : 호출 메서드에게 돌려줄 값
스택 프레임은 메서드가 호출될 때 메모리에 할당되고, 종료되면 메모리에서 제거된다.
결과적으로 기본 자료형에 해당되는 지역변수와 매개변수의 데이터 값이 Stack Area에 저장된다.
new
키워드를 통해 생성된 객체, Array와 같은 동적으로 생성된 데이터가 저장된다.그렇다면 Heap 메모리에 저장된 데이터들은 어떻게 소멸되는 지 알아보자.
Heap 영역에서 stack에서 도달 불가능한(Unreachable) 오브젝트들은 가비지 컬렉션의 대상이다.
자바 메모리 관리 - 가비지 컬렉션
[Java] 자바 JVM 메모리 관리 파헤치기 (스택, 힙, Reference Type, 가비지 컬렉터)