본문 바로가기

프로그래밍/Java

GC

반응형

해당 포스트의 작성 목적

GC포스팅을 한줄 알았는데, 공부만 하고 올리지 못했었다... 뭐지... JVM을 공부하면서 자연스럽게 GC에 대한 부분도 공부를 해야함을 느꼈다.

GarbageCollector

https://asfirstalways.tistory.com/159

프로그래머는 힙을 사용할 수 있는 만큼 자유롭게 사용하고, 더 이상 사용되지 않는 오브젝트들은 가비지 컬렉션이 자동으로 메모리에서 제거하도록 하는 것이 가비지 컬렉션의 기본 개념이다.

GC는 기본적으로 Reachable한 객체와 UnReachable한 객체를 나누고, UnReachable한 객체를 소거한다. 해당 객체에 접근할 수있는 수단이 있다면 Reachable이다. (주소값을 참조하는 변수가 있으면 됨!!

GC는 각 객체가 old한지, young한지 판별하는 기준으로 Aging이라는 개념을 쓴다.

해당객체가 살아남은 GC의 횟수를 Age라 하며, 대부분 8→9 시점에 young→old가 된다. (명시적으로 지정도 가능하다)

GC의 전제조건

= weak generational hypothesis

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

MinorGC

새로 생성된 대부분의 객체는 Eden영역에 위치한다. Eden영역에서 GC가 한 번 발생한 후 살아남은 개체는 Survivor영역중 한 곳으로 이동된다. (GC가 발생할 때마다 랜덤으로 가지않고, 하나의 Survivor 영역이 다 찰 때까지 한 Survivor영역으로 이동한다.)하나의 Survivor 영역이 가득차면 그중 살아남은 객체를 다른 Survivor 객체로 이동한다. 그리고 가득 찬 Survivor 영역은 아무 데이터도 없는 상태가 된다.이 과정을 반복하며 계속 살아남는 객체는 일정시간 참조 되고 있다는 뜻으로, Old영역으로 이동한다.

  •  
    perm이 Method Area?,,, JVM이랑 똑같은걸 말하는건지?...

MajorGC

Old영역에 있는 모든 객체들을 검사, 참조되지 않은 객체들을 한번에 삭제한다. 시간이 오래 걸리고 실행 중 모든 프로세스가 정지된다. 이를 stop the world라고 하며, GC튜닝은 stop the world 시간을 줄이는 것을 목표로 한다.

GC의 방법 5가지

4가지는 Young영역의 대한 방식이 앞서 설명한 것과 같고, 1가지는 아예 새로운 개념으로 GC를 수행한다.

  1. Serrial GC하나의 CPU로 Young과 Old영역을 연속적으로 처리한다. 컬랙션이 수행 될때 애플리케이션이 정지된다.Old영역에서 쓰지않는 객체를 표시(Mark)하고, heap의 앞부분부터 확인, 살아있는 것만 남긴다(Sweep), 이후 각 객체들이 연속되게 쌓이도록 힙의 가장 앞부분부터 채워서 객체가 존재하는 부분과 객체가 없는 부분으로 나눈다.(Compaction) Mark Sweep Compact알고리즘을 사용한다.
  2. MarkSweepCompaction 알고리즘을 사용한다!
  1. Parallel GCSerialGC와 기본적인 알고리즘은 같지만, GC를 처리하는 스레드가 여러개있다. SerialGC보다 더 빠르다.
  1. ParallelOld GCParallelGC와 Old부분의 알고리즘만 다르다. Mark-SUmmary-Compaction단계를 거친다.
  2. Summary단계는 앞서 GC를 수행한 영역에 대해서도 별도로 살아있는 객체를 식별한다는 점에서 sweep과 다르며, 좀더 복잡하다.
  1. CMS GC
    https://d2.naver.com/helloworld/1329
    짧은 대기 시간으로 살아있는 객체를 찾는다 -> 서버 수행시 살아있는 객체에 표시를 한다 -> 표시 도중에 변경된 객체에 대해 다시 표시한다 -> 표시된 쓰레기를 정리한다다른 방식보다 메모리와 CPU를 더 사용한다.
  2. stop-the-world가 매우 짧다. compaction을 제공하지 않기 때문에, 개발자가 직접 해줘야 한다.
  1. G1 GC지금까지의 Young영역과 Old영역과는 관계없는 방식이다.

    포스트를 작성하며 알게된 점

    GC를 공부하면서, 왜 Static 변수들을 남발하면 안되는지 알게되었다. Static변수는 프로그램이 끝날때까지 살아있으므로, 힙메모리의 참조가 끊기지 않아 GC대상이 안되기 때문이었다.

    Reference

    Java Garbage Collection
  2. 가비지컬렉션(Garbage Collection)/ JVM 구동원리에 이어서
  3. 처음 멘토링 상담을 하면서 받게된 질문인데, 이젠 잘 대답할수있겠다!
  4. G1 GC는 바둑판 모양으로 구성되어 있으며, 약 2000개의 구역을 사용한다. 이중 일부를 선정해 Young영역으로 지정후, 해당 구역에 데이터가 꽉차면 GC를 실행한다. 이후 다른 영역에서 객체를 할당하고 GC를 실행한다. 성능이 제일 좋다.
반응형

'프로그래밍 > Java' 카테고리의 다른 글

java.lang -1 WrapperClass  (0) 2021.05.18
JAVA의 역사와 JVM-2  (0) 2021.05.18
JAVA의 역사와 JVM-1  (0) 2021.05.18
Annotation  (0) 2021.05.17
Static 변수의 메모리 해제-Weak/Soft Reference  (0) 2021.05.17