ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Heap 영역 Detail / Garbage-Collection
    전공 지식/JAVA 2020. 7. 13. 23:03

    JVM 에서 Garbage-Collection 의 대상인 Heap 영역에 대해서 좀 더 깊게 알아보고

    Garbage-Collection 의 대상은 무엇인지 정리해보자!

     

     

    JAVA 1.7 이하

     

    자바 1.7 이하의 Heap 출처 : https://coding-start.tistory.com/205

    Yeong Generation

    1. Eden

    • Object, Array 가 Heap 에 최초로 할당되는 장소
    • 영역이 꽉 차게 되면 참조 여부를 따져 참조가 되어 있는 Live Object : Suvivor 영역으로 넘김
    • 참조가 끊어진 Garbage Object : 그대로 둠
    • 모든 Live Object 가 Survivor 영역으로 넘어가게 되면 Minor GC 를 한다

    2. Suvivor (S0, S1)

    • Eden 에서 살아남은 Object 가 잠시 머무는 공간
    • Live Object 를 대피 시킬 때 하나의 survivor 만 사용하게 되고 이런 과정이 Minor GC 라고 한다

    Old Generation

    • Live Object 로 오래 살아남아 성숙된 Object (애플리케이션에서 특정 횟수 이상 참조되서 기준 age 를 초과한 Object) 를 저장하는 영역
    • 새로 Heap 에 할당되는 Object X 오랫동안 참조가 되어 이용되고 앞으로도 사용확률이 높은 Object 저장
    • Old Generation 의 메모리도 충분하지 않으면 GC 발생 -> Full GC (Major GC)

    Perm ( JAVA 8 에선 Metaspace 영역으로 전환됨 뒤에 설명 할꺼야)

    • 클래스의 메타정보
    • 메소드의 메타 정보
    • Static 변수와 상수 정보들이 저장 되는 공간

     

    JAVA 1.8

    자바 8 에서 JVM 메모리 구조적인 개선 사항으로 Perm 영역이 MetaSpace 영역으로 전환 되고

    기존 Perm 영역은 사라지게 되었다.

    MetaSpace 영역은 Heap 이 아닌 Native 메모리 영역으로 취급

    (Heap : JVM 에 의해 관리된 영역

    Native : OS Level 에서 관리하는 영역)

     구분

    상세 구분 

    ~ Java 7까지 버전(Perm) 

    ~ Java 8 버전(Metaspace) 

    저장 정보 

     Class의 Meta 정보

    저장 

    저장 

    Method의 Meta 정보 

    저장 

    저장 

    Static Object 변수, 상수 

    저장 

    Heap 영역으로 이동 

     관리 포인트

    메모리 관리(튜닝) 

    Heap 영역 튜닝외에

    Perm 영역 별도 튜닝 

    Heap 영역 튜닝

    Native 영역 동적 조정

    (별도 옵션으로 조절 가능) 

    GC 측면 

     GC 수행 대상

     Full GC 수행 대상

     Full GC 수행 대상

    메모리 측면 

     메모리 크기(옵션)

     -XX: PermSize

    -XX: MaxPermSize

     -XX: MetaspaceSize

    -XX: MaxMetaspaceSize

     

    *** 1.8 로 넘어오며 주의해야 할 점

    MetaSpace 가 잡고있는 maxSize : 16Exabyte 로 64bit process 가 취급 할 수 있는 메모리의 상한치

    MetaSpace 영역은 Native 메모리로 다루기 때문에기본적으로 JVM 에 의해 크기가 강제되지 않고 프로세스가 이용할 수 있는 메모리 자원을 최대한 활용할 수 있다고 본다.

    만약 Classloader에 메모리 누수가 의심되는 경우 -XX:MaxMetaspaceSize 를 지정 할 필요가 있다. 최대 값을 정해놓지 않는다면 Metaspace 영역의 메모리가 계속해서 커질 것이고 결국은 서버가 죽는 경우가 생길 수 있다.

     

    Full GC (Major GC) : 방식 (1.7 기준)

    1. Serial GC

    2. Parallel GC

    3. Parallel Old GC (Parallel Compating GC)

    4. Concurrenr Mark & Sweep GC

    5. G1(Garbage First GC)

     

    Serial GC

    •  CPU 코어가 하나만 있을 때 사용하기 위해서 만든 방식 (애플리케이션의 성능 저하가 될 수 있음)
    • Old 영역의 GC 는 Mark Sweep Compact 이라는 알고리즘을 사용함
      • 참조가 없는 객체에 Mark 한 후, 해당 객체를 모두 제거하는 방법
      • Heap 메모리 사이사이에 비는 공간이 생기고 이 부분을 제거하기 위해 각 객체들이 연속되게 쌓이도록 앞 부분부터 채워서 공간을 정리하는 Compact 과정이 있음

    Parallel GC

    • 기본적인 알고리즘은 같다. Parallel GC 는 처리하는 Thread 가 여러개임
    • 보다 빠르게 객체를 처리할 수 있음
    • 메모리가 충분하고 코어의 갯수가 많을 때 유리함

     

     

    출처 : https://coding-start.tistory.com/205

    '전공 지식 > JAVA' 카테고리의 다른 글

    Java 7 -> 8 로 달라진 부분  (0) 2020.07.29
    Interface  (0) 2020.07.23
    String StringBuilder StringBuffer  (0) 2018.12.06
    interface 간 상속 및 다중 상속  (0) 2018.12.05
    Final 변수, 함수, Class  (0) 2018.12.05

    댓글