티스토리 뷰

java

메모리는 어떻게 할당하는가

ssffwert 2022. 1. 2. 19:02

JAVA 프로그래밍 면접 이렇게 준비한다(노엘 마크엄 지음/정원천 옮김) p.245 ~ 249 내용 정리
2021.12.27(월) 23:00 ~ 23:30

 


메모리는 어떻게 할당하는가?
new 키워드는 자바 힙 영역에 메모리를 할당 한다. 힙은 애플리케이션 영역에 접근할 수 있는 메인 영역이다.
객체를 할당할 때 이용할 수 있는 메모리가 충분치 않으면 JVM(자바 가상머신)은 가비지 컬렉션을 이용해 힙에서 메모리를 재사용하려고 시도한다.
그래도 충분한 메모리 영역을 확보할 수 없다면 OutOfMemoryError가 발생하며 JVM이 종료된다.

힙은 제너레이션이라는 몇 가지 영역으로 구분된다. 가비지 컬렉션에서 객체가 수집 대상에서 제외된다면 다른 제너레이션으로 옮겨진다.
예를 들어 older제너레이션은 가비지 컬렉션에서 자주 수집하지 않는 객체가 저장되어 있다.
이미 오랫동안 제거되지 않았음이 증명된 것이므로 가비지 컬렉션에서 수집할 가능성이 낮다.


가비지 컬렉션이란 무엇인가?
가비지 컬렉션은 기존에 할당된 메모리를 재사용하는 메커니즘으로, 나중에 메모리를 할당할 때 재사용할 수 있다.
가비지 컬렉션 알고리즘은 몇가지가 있는데, 모든 작동 중인 코드에서 더 이상 참조하지 않는 메모리를 찾은 후 메모리를 할당할 때 이용할 수 있도록 반환한다는 공통의 목적이 있다.
자바의 전통적인 가비지 컬렉션은 mark-and-swewp 방식이다.
실행 중인 코드에서 참조하는 객체는 live로 표시되며 해당 객체에서 참조하는 것들 역시 확인해서 live로 표시한다. 이는 현재 동작하는 객체의 모든 경로가 확인될 때까지 계속된다.
이 과정이 끝나면 힙에 있는 각 객체들을 찾아다니며 live로 표시되지 않은 메모리 위치에 메모리를 할당할 수 있게 만든다.
이 과정이 진행되는 동안에는 메모리를 재배치하려고 JVM의 모든 스레드가 정지되는데, 이를 stop-the-world라고 한다.

결국 가비지 컬렉션은 다른 제너레이션으로의 이동과 가능한 한 많은 여유 공간을 남겨두려는 목적으로 메모리에서 객체들을 옮기고 자주 접근되는 객체들을 묶어두는 등의 다른 연산을 수행한다.
이것을 컴패션이라고 하며, 컴패션은 live로 표시한 객체들을 다른 물리적인 메모리 위치로 옮김으로서 JVM이 stop-the-wold인 동안 메모리 공간을 확보한다.

 


'java' 카테고리의 다른 글

예외처리(exception handling)  (0) 2022.05.01
싱글톤패턴  (0) 2022.04.26
메이븐이란 무엇인가  (0) 2022.01.02
자바 키/값 확인 출력 코드  (0) 2021.02.08
알파벳을 5 칸을 밀어서 출력하기  (0) 2017.02.16
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday