본문 바로가기
츄Log/끄적끄적

JVM runtime data area, GC 포인트

by 츄츄🦭 2023. 12. 31.
728x90

출처 : https://www.geeksforgeeks.org/jvm-works-jvm-architecture/

JVM 구조와 GC에 대해 다시 공부했습니다.

 

가끔 생각날 때마다 보긴 하는데 장기기억으로는 가지 않아서 이번에도 마치 처음 보는 녀석 같았습니다ㅎㅎ

 

이번에 배운 포인트 몇 가지만 정리해보려고 합니다.

 

JVM의 runtime data area 관련

1. Metaspace영역은 java heap이 아닌 native 메모리 영역을 사용합니다.

리플렉션 클래스를 로드시 사용하므로, Spring을 사용하여 개발하는 사람들은 이 부분을 기억해둬야할 것 같습니다. 

(java heap이 아닌 native memory영역을 사용하므로 메모리 관리에 실패할 경우 OS수준까지 문제가 전파되기 때문입니다.)

 

2. Native Memory 영역이 있습니다.

여기에는 위에 이야기한 Metaspace, C heap, Thread Stack등이 들어갑니다.

Native언어로 개발된 메서드를 지원하기 위한 스택이므로 OS레벨의 이야기입니다.

JNI 또한 이곳을 사용하여 JVM과 OS레벨이 통신할 수 있도록 합니다.

(JNI 인터페이스의 포인트도 이야기하자면, JNI를 통해 네이티브 코드를 직접 실행할 수 있고, OS수준의 명령을 다이렉트로 실행할 수 있으므로 Java의 보안 정책을 우회할 수 있어서 언제나 보안 이슈가 발생할 수 있음을 인지해야 합니다. log4j 가 떠오릅니다.)

 

GC 관련

JVM의 runtime data area의 heap space를 관리해주는 개념이 Garbage Collection이고, 다양한 Collection 전략이 있습니다. 

heap space와 GC의 관계는 자료구조와 알고리즘의 관계로 보면 될 것 같습니다.

어떤 알고리즘을 선택하고 싶냐, 선택하느냐에 따라 필요한 자료구조가 다른 것처럼, 어떤 전략의 GC를 사용하고 싶냐에 따라 heap space 구성(자료구조)이 달라집니다. 

 

1. GC Roots 라는 개념이 있습니다.

객체들은 모두 의존관계를 가지고 있고, 이 의존관계에 의하여 유지와 삭제 이루어집니다.

(ex. A->B->C 의존관계가 있을 때, A가 살아있으면 B,C도 유지 A가 삭제되면 B,C도 삭제됩니다)

이 때 static field에 할당된 인스턴스는 삭제될 일이 없고 지속적인 접근으로 old generation으로 위치할 확률이 높아집니다.

그러므로 개발자는 static field를 사용할 때 이 부분을 인지하고 있어야 합니다. (남용 금지입니다.)

 

2. GC종류는 굉장히 많지만, Parallel GC (JVM 기본), G1GC, ZGC 정도만 알면 될 것 같습니다.

Parallel GC는 멀티스레드 기반으로 작동해서 효율(처리량)을 높였습니다. 

멀티스레딩 덕분에 MinorGC는 물론이고, STW(Stop the world)가 발생한 Major GC 시점에 과거 Single 스레딩 GC보다 응용프로그램 중단을 최소화 시킬 수 있습니다.

 

G1GC는 Garbage First GC로, 4GB이상의 대용량 Heap 메모리를 사용하는 멀티스레드 기반의 응용프로그램에 특화된 GC입니다.

Heap을 Region이라는 1~32MB 영역으로 분할하여 멀티스레드로 스캔합니다. 

Parallel GC와 차이점은 G1GC는 예측 가능한 GC시간을 달성합니다.

 

ZGC는 수백기가~몇테라까지의 대규모 힙 크기를 지원합니다. 

ZGC또한 Heap을 Region으로 나누어 수집하고 각 구역에 대해 멀티스레드를 활용하여 GC를 수행합니다.

 

 

더 생각나는 내용이 있으면 계속 추가해보겠습니다.

 

728x90