JVM&GC

이한수·2022년 1월 13일
0

JAVA

목록 보기
1/9
post-thumbnail

*개인 공부내용을 정리 중입니다
잘못알고 있는 부분이 있을 경우 알려주시면 감사하겠습니다!!

1. JAVA의 특징

  • 자바는 객체지향 언어이다.
  • 풍부한 기능을 제공하는 오픈 소스이다.
  • 운영체제에 영향을 받지 않는다.
  • 자동 메모리 관리
  • 멀티쓰레드의 지원
  • 동적로딩 지원

2.JAVA는 타 언어들과 달리 운영체제에 독립적인 특성

간단히 말해 JVM 덕분입니다.

이처럼 JAVA는 바이트 코드로 변환된 class 파일이란 단계를 한번 더 거칩니다.

이 class파일을 JVM이 각 운영체제에 맞는 실행 파일로 만들어 줍니다.

(JAVA는 운영체제에 독립적이지만 , JVM은 운영체제에 의존한다)

3.JVM 동작 원리

JVM 내부는 크게 Class Loader , Execution Engine , Runtime Data Area 로 나눌 수 있습니다.

참고 : Runtime Data Area는 JVM이 프로그램 수행하기 위해 OS로부터 할당 받은 메모리 공간

먼저 , JVM은 클래스파일을 읽어 Class Loader에 전달

→ Class Loader는 전달된 바이트 코드에서 동적 로딩을 통해 필요한 클래스들을 로딩 및 링크하여 Runtime Data Area에 적재한다.

→ Execution Engine은 Runtime Data Area에 적재된 코드들을 명령어 단위로 가져와서 실행합니다.(인터 프리터와 JIT 컴파일러 이용)

더 세밀한 JVM구조

(사진의 메모리가 Runtime Data Area)

4. 또 한가지 JAVA의 특화된 장점

  • 사용하지 않는 메모리를 알아서 수거해준다는 점이 있습니다.
    이 역할을 수행하는 것이 JVM 내부에 Gabage Collection(GC)

  • 참조되지 않는 객체에 대한 메모리를 수거한다.

  • System.gc()로 메모리를 개발자가 직접 해제해줄 수 있지만 성능에 매우 큰 영향을 끼칩니다.

  • 아래 언급되는 메모리들의 공간이 가득 찼을 경우 gc가 발동합니다.

*어떤 문제??
GC가 수행되는 동안 GC를 실행하는 쓰레드를 제외하고는 모두 중지 상태가 되므로 수동으로 생각 없이 호출하는 것은 위험하다.

5.Heap 구조에 따른 GC의 구동

  • 먼저 GC는 참조되지 않는 객체의 메모리를 회수 합니다.
    그 객체가 생성되는 공간이 JVM의 메모리공간 중에서 Heap영역입니다.

Young Generation, Old Generation으로 크게 두개의 영역으로 나누어 지고, Young Generation은 또다시 Eden, Survivor0,1로 세분화 되어집니다.

1.새로운 오브젝트는 Eden 영역에 할당됩니다. 두 개의 Survivor는 비워진 상태로 시작되게 됩니다.

2.Eden 영역이 오브젝트로 가득차면, MinorGC가 발생합니다.

3.MinorGC가 발생하면, Reachable 오브젝트들은 Survivor0으로 옮겨지게 됩니다.
Unreachable 오브젝트들은 Eden 영역이 초기화 될때 함께 메모리에서 사라지게 됩니다.

4.다음 MinorGC가 발생할때, Eden 영역에는 3번과 같은 과정이 발생합니다. Unreachable 오브젝트들은 지워지고, Reachable 오브젝트들은 Survivor로 이동하게 됩니다. 기존에 Survivor1에 있었던 Reachable 오브젝트들은 Survivor2로 옮겨지는데, 이때 age 값이 증가되며 옮겨집니다. 살아남은 모든 오브젝트들이 Survivor1으로 모두 옮겨지면, Survivor0과 Eden은 초기화 됩니다. 여기서 Survivor0에서 Survivor1로의 이동은 늘 age 값의 증가를 병행하게 됩니다.

5.다음 MinorGC가 발생하면, 4번 과정이 반복되는데, Surviovr1이 가득차 있었으므로 Survivor1에서 살아남은 오브젝트들은 Survivor0으로 옮겨지면서, Survivor1과 Eden은 초기화 됩니다. 이때에도, age값이 증가되어 옮겨지게 됩니다.

6.Young Generation에서 게속해서 살아남으며 age값이 증가하는 오브젝트들은 age값이 특정값 이상이 되면 Old Generation으로 옮겨지게 되는데 이 단계를 Promotion이라고 합니다.

7.MinorGC가 계속해서 반복되면, Promotion 작업도 꾸준히 발생하게 됩니다.

8.Promotion 작업이 계속해서 반복되면서 Old Generation이 가득차게 되면 MajorGC가 발생하게 됩니다.

이 과정들이 반복되는 것이 가비지 컬렉션입니다.

개인 궁금증
이때 YOUNG영역에서는 Eden과 survivor 중에 가득찬 부분만 gc가 호출될까?? 아니면 한군데라도 가득차면 young영역 전체를 수행하는 걸까...

4)old영역에 대한 GC

  • old영역에 데이터가 가득 차면 old영역에 GC 실행.

6.Runtime Data Area

1)Class Area
-메소드 영역이라고도 하며 , 클래스 , 인터페이스 , 메서드 , 필드 , static 변수등의 바이트 코드가 저장된다.
-모든 쓰레드가 공유한다.

2)Heap Area
-new키워드로 생성된 객체와 배열이 생성되는 영역이다.
또한 메서드 영역에 로드된 클래스만 생성이 가능하며 ,
아까 언급했던 Garbage Collector가 참조되지 않은 메모리를 확인하고 제거한다.
-모든 쓰레드가 공유한다.

3)Stack Area
-메소드 호출시마다 메소드를 위한 공간이 생성이 되는데 ,
메서드의 매개변수 , 지역변수 , 리턴값등이 임시로 저장되며 메소드 수행이 끝난후 영역은 해제된다.
(객체를 참조하는 변수또한 저장된다)

4)Pc Register
-스레드가 시작할 때 생성되며 현재 수행중이 jvm에 명령의 주소를 갖는다.

5)Native Method Stack
-자바 외 언어로 작성된 네이티브 코드를 위한 영역이다.

참고 : https://d2.naver.com/helloworld/1329
참고 : https://ybdeveloper.tistory.com/41

profile
성실하게

0개의 댓글