멘토링을 하다가 멘토님에게 "GC를 왜 두개로 나누고 한곳을 survivor을 비워야할까요?"라는 질문을 받았다. 단순히 그렇구나라고만 생각하고 지나갔었는데 설명을 듣고 이유를 찾아봤다.
You must be wondering why do we have 2 survivor space. We have 2 survivor spaces to avoid memory fragmentation. Each time you copy objects from eden to survivor and you get empty eden space and 1 empty survivor space.
GC가 일어나 eden이나 survivor 영역에 객체가 제거되면 파편화된 메모리 영역이 존재하게 되는데 이를 한 영역에 모아놔서 순차읽기/쓰기를 하려고 한곳을 비운다.
이는 ‘디스크 조각 모음’과 비슷하다고 보면 된다. 하드 디스크에 파일 저장시에 이곳 저곳에 흩어져서 저장되는 것을 단편화(fragmentation) 라고 하는데 그리고 이 단편화가 발생한 디스크들을 한 덩어리로 모아 재배치해주는게 디스크 조각 모음 이다. 이렇게 디스크 조각 모음을 하게 되면 순차읽기/쓰기를 하게 되어 속도가 빨라지게 된다.
따라서 gc가 일어날때 survivor의 한 곳에 모으는 이유도 더 빠르게 읽기 위함이며, 이러한 점이 결국 메모리 관리를 하지 않아도 되는 자바의 장점이기도 하다. 추가로 보통 하드디스크에서 ‘삭제’라는 작업은 매우 비용이 높은 작업이다. 따라서 연속된 메모리에서 중간에 값이 데이터상으로 삭제되었을 때 실제 메모리의 값을 삭제하지않고, 다른곳에서 이곳이 사용되지 않고있다고 체크하고 다음에 사용할때 체크한 곳을 보통 덮어씌우는 방식을 사용한다.
📌
공부할때 크게 의문점을 못 가진 부분이었는데 당연하게도 모든 이유가 존재한다는 것을 깨달은 순간이었다.
참고
https://medium.com/javarevisited/understanding-garbage-collection-in-java-java2blog-639bceaa4426
'Java' 카테고리의 다른 글
[JAVA] ArrayList의 로드팩터는 1인데 HashMap의 로드팩터는 0.75일까? (0) | 2024.01.26 |
---|---|
[JAVA] float과 double은 왜 정확한 숫자계산에 쓸 수 없을까? (0) | 2024.01.19 |
[JAVA] 자바의 hashcode는 무엇이고, 어디에 사용할까? (0) | 2024.01.18 |
[JAVA] == 와 equals()의 차이 (1) | 2024.01.05 |
[JAVA] 객체지향 프로그래밍 - 클래스와 객체 (0) | 2023.12.19 |