개발 언어/Java

grabage collector

피어나는 열정 2021. 11. 10. 17:52

Java 의 GC는 어떻게 동작하나?

June 04, 2018


GC (Garbage Collecton)

더이상 사용하지 않는 객체 등을 메모리에서 해제(삭제)하는 JVM의 작업

Java 프로세스가 동작하는 과정에서 GC는 불필요한 또는 더이상은 사용하지 않는 객체들을 메모리에서 제거함으로써, Java 프로세스가 한정된 메모리를 효율적으로 사용할 수 있게 해준다.

또한 JVM에서 GC의 스케줄링을 담당함으로서 Java 프로그래머들에게는 메모리를 관리해야하는 부담을 줄여주게된다. 즉, 일반적인 개발 작업간에는 메모리 할당/해제를 직접 프로그래밍하지 않아도 된다는 이야기다.

JVM의 GC에 대해서 알기 위해서는 우선 JVM메모리 구조 대해서 알아야 한다.

JVM Heap 구조

 

Java 메모리의 각 영역에서 GC가 발생하면, 사용하지 않는(참조가 존재하지 않는) 객체들은 메모리에서 제거된다.

 

java7 까지의 permanent(영속적, 이하 perm) 영역에는  다음과 같은 정보들이 저장되었다.

  • Class 의 Meta정보 (pkg path 정보라고 보면 됨, text 정보)
  •  Method의  Meta 정보
  •  Static Object
  • 상수화된 String Object
  • Class와 관련된 배열 객체 Meta 정보
  • JVM 내부적인 객체들과 최적화컴파일러(JIT)의 최적화 정보

 

  • 아래와 같은 것들이 Java Heap 이나 native heap 영역으로 이동했다.
    • class meta-data -> native heap
    • Interned String -> Java Heap
    • Class statics -> Java Heap

 

Java 에서 GC를 도입이 가능했던 이유?

weak generational hypothesis 가설로 인해 GC 도입이 가능했다.

  • 대부분의 객체는 금방 접근 불가능 상태(unreachable)가 된다.
  • 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다.

 

GC 가 일어나는 과정

GC는 사용하지 않는 객체를 메모리에서 제거하는 작업이다.

 

그럼 어떤 객체를 메모리에서 제거하고, 또 제거하지 말아야 하나?

현재 열심히 사용중인 객체를 메모리에서 제거해버린다면, 프로그램이 정상적으로 실행되지 않을 것이다.

때문에, GC를 위해서는 우선 메모리에 있는 객체가 현재 사용중인지 사용중이 아닌지를 구분할 수 있어야 한다.

 

위에서 살펴본 weak generational hypothesis 를 보면 ‘오래된 객체’라는 말이 나온다. 그럼 오래되었다는 기준은 무엇일까?

JVM에서는 이 오래됨 을 표현하기 위해 메모리를 여러 영역으로 나눈다.

JVM 메모리 영역(Heap)내에서 객체의 이동

 

처음 생성된 객체 new Model(); 는 Young Generation 영역의 일부인 Eden 영역에 위치하게된다. 그리고 Minor GC가 발생하게 되면, 사용하지 않는 다시말하면 다른 곳에서 참조되지 않는 객체는 메모리에서 제거된다.

Eden 영역에서 살아남은 객체는 Young Generation 영역의 또다른 일부인 Survivor 영역으로 이동하게된다. Survivor 영역은 Survivor1 영역과 Survivor2 영역으로 구성되어 있는데, Minor GC가 발생할 때마다 Survivor1 영역에서 Survivor2 영역으로 또는 Survivor2 영역에서 Survivor1 영역으로 객체가 이동하게되며, 이 과정에서 더이상 참조되지 않는 객체는 메모리에서 제거된다.

 

Minor GC가 발생하는 동안 Survivor1, Survivor2 영역을 오가며 살아남은 객체들은 최종적으로 Old Generation 영역으로 옮겨지며, Old Generation 영역에 있다가 미사용된다고 식별되는 객체들은 Full GC를 통해 메모리에서 제거된다

https://blog.naver.com/PostView.naver?blogId=csound93&logNo=221832742479&categoryNo=0&parentCategoryNo=0&viewDate=&currentPage=1&postListTopCurrentPage=1&from=postView 

https://openjdk.java.net/projects/jdk7u/

 

https://blog.naver.com/kbh3983/220985603798

'개발 언어 > Java' 카테고리의 다른 글

Generic  (0) 2021.11.24
리플렉션  (0) 2021.11.21
자바 실행 과정  (0) 2021.11.03
[java] JVM 이란?  (0) 2021.10.27