• 자바 바이트코드를 실행할수 있는 주체 (자바가상머신)
  • 자바 코드를 컴파일해서 얻은 바이트 코드를 해당 운영체제가 이해할 있는 기계어로 바꿔 실행시켜주는 역할

  • JVM구성
    • Class Loader
      • 클래스 파일들을 JVM 운영체제로 부터 할당받은 메모리 영역인 Runtime Data Area 적재하는 역할
    • Execution Engine
      • 메모리에 적재된 클래스들을 기계어로 변경해 명령어 단위로 실행하는 역할
        • 인터프리터 방식
        • JIT(Just-In-Time)컴파일러를 이용하는 방식
          - 적절한 시간에 전체 바이트 코드를 네이티브 코드로 변경해서 Execution Engine 네이티브로 컴파    일된 코드를 실행하는 것으로 성능을 높이는 방식이다.
    • Garbage Collector
      • Heap 메모리 영역에 생성된 객체들 중에 참조되지 않는 객체들을 탐색후 제거하는 역할
      • GC 수행되는 동안 GC 수행하는 쓰레드가 아닌 다른 모든 쓰레드가 일시정지
    • Runtime Data Area
      • JVM 메모리 영역
      • 자바 어플리케이션을 실행할 사용되는 데이터들을 적재하는 영역

      • Method Area
        • 클래스 멤버변수의 이름, 데이터타입, 접근제어자정보 같은 필드정보와 메소드의 이름, 정보 , 리턴타입, 파라미터, Type정보(interface, class), Constant Pool(상수풀 문자 상수, 타입, 필드 객체참조), static변수, final class 변수등이 생성되는 영역
      • Heap Area
        • New 키워드로 생성되 객체와 배열이 생성되는 영역
        •  메소드 영역에 로드된 클래스만 생성가능
        • Garbage Collector 참조되지 않는 메모리를 확인하고 제거하는 영역
      • Stack Area
        • 지역변수, 파라미터, 리턴 , 연산에 사용되는 임시 값등이 생성되는 영역(Person p = new Person() => Person p 스택영역, new Person() 힙영역)
      • PC Register
        • Thread 생성될때마다 생성되는 영역
        • Thread 실행되는 부분의 주소와 명령을 저장하는 영역
      • Native Method Stack
        • 자바 언어로 작성된 네이티브 코드를 위한 메모리영역
      • ==> Thread 생성시 Mehod, Heap영역을 모든스레드가 공유
      • Stack 영역, PC레지스터, Native Method Stack 각각의 쓰레드마다 생성되며 공유되지 않는다
    • Heap Area & Garbage Collector
      • Heap영역 구조(Young Generation(Eden, Survivor 1 2), Old Generation)
      • JDK8 부터는 permanent 영역은 사라지고 일부가 meta space영역으로 변경(meta space영역은 Native Method Stack영역에 포함)
    • GC 프로세스
      • Minor GC : NEW 영역에서 일어나는 GC
        • 최초객체 생성시 Eden영역에 생성
        • Eden영역에 객체가 가득찼을시 첫번째 GC
        • Eden -> Survivor1영역으로 메모리를 그대로 복사후 Survivor1영역을 제외한 다른영역 객체 제거
        • Eden영역도  Survivor1영역도 가득찰시 Eden영역과 Survivor1영역에 생성된 객체중 참조되고 있지 않은 객체가 있는지 검사
        • 참조되고 있지 않은 객체는 냅두고 참조되고 있는 객체만 Survivor2 복사
        • Survivor영역을 제외한 나머지 영역 객체 제거
        • 과정중 일정횟수 이상 참조되고 있는 객체들을 Survivor2 -> Old영역으로 이동
          • Survivor2영역 까지 꽉차기 전에 계속해서 Old영역으로 비움
      • Major GC(Full GC)
        • Old영역에 있는 참조가 없는 객체들을 표시하고 해당객체들을 모두 제거
        • Heap영역에 중간중간 객체들이 제거되고 메모리 공간이 생기면 이부분을 없애기 위해 재구성(메모리정리) => 메모리를 옮기는데 다른쓰레드가 메모리를 사용해 버리면 안되기에 모든쓰레드 정지

'Language > Java' 카테고리의 다른 글

Session 과 Cookie  (0) 2021.08.17
컴포넌트와 모듈의차이  (0) 2021.08.17
절차지향 VS 객체지항  (0) 2021.08.17

+ Recent posts