1. automatic garbage collection.

프로그램에서 <사용되고있거나 or 참조되고있는> 객체와 <사용되지않거나 or 참조되고있지않는> 객체를 구별하여,
<사용되지않고 or 참조되지않고있는> 객체가 사용하는 메모리를 회수 할 수 있다.
c에서는 수동 프로세스인데, java에서는 automatic process!

2. process

  • step1. marking
    • 마킹단계에서는 모든 객체들을 스캔하여, 어떤것이 안쓰이는지를 마킹함.
  • step2. normal deletion
    • 참조되는 객체는 남기고, 참조되지 않는 객체는 지우고, 메모리 할당은 free space를 가르키고, 메모리 할당이 이루어져야 할때 free space를 찾는다.
  • step3. deletion with compacting
    • 남겨진 참조되는 객체들을 compact 압축 할 수 있다.
    • 남겨진 객체들을 모음으로써 새로운 메모리 할당을 더욱 쉽고, 빠르게 할 수 있음. ---- 선택?

3. the generatinal garbage collection process.

대부분의 객체들은 아주 짧은 수명을 지님.
시간이 지남에 따라 더 적은 수의 객체가 할당 된 상태로 유지 됨.
실제로 대부분의 객체는 그래프 왼쪽값이 높을 수록 수명이 매우 짧음.
jvm성능 강화를 위해 위의 내용을 참고하여 jvm generations개념을 도입함.

young generation은 1개의 eden영역과 2개의 survivor영역(s0, s1)이 존재.
지난 글 참조. 2020/02/19 - [우리는 개발자] - [java] GC에 관하여.

  • step1. 새로운 객체가 eden영역에 할당됨. survivor영역은 빈곳으로 시작.
  • step2. eden영역 모두 차면, 마이너 gc발생 : 참조되는 객체가 s0 영역으로 이동되고, 참조되지 않는 영역은 지워짐.
  • step3. 다음 gc에도 같은 일이 eden영역에서 벌어지는데, 참조되지 않는 영역은 지워지고 참조되는 영역은 s1 으로 이동.                               s0에 있던 객체들도 s1로 이동. 이동할때마다 age가 1씩 늘어나는 셈.
  • step4. 모든 surviving 객체가 s1으로 이동되면 s0과 eden이 모두 클리어된 상태. survivor공간에는 age가 다른 객체들이 존재하게됨.
  • step5. 다음 minor gc에도 같은 프로세스가 반복됨. 이때에 survivor spaces들이 전환됨.
  • step6. minor gc이후 오래된 객체들은 특정 age(treshold)에 도달하면 old generation으로 승격됨.
  • step7. 계속해서 minor gc가 일어나다가, 결국에는 old genertaion에서 major gc도 발생하게 됨.

그림으로 살펴보면 아래와 같은 흐름이 됨.

* 아주 잘 정리되어있는 오라클 공식문서 

4. jvm java garbage collectors 옵션 설정.

-Xms : jvm start할때 초기 heap size.
-Xmx : maximum heap size.
-Xmn : young gengeration size.
-XX:PermSize : starting size of the permanent generation.
-XX:MaxPermSize : the maximu, size of the Permanent Generation

+ Recent posts