본문 바로가기
JAVA & JVM

JVM(Java Virtual Machine)의 정의와 특징, 구조

by 샤워하다돌면워싱턴 2022. 8. 30.
반응형

 

정의
 
Java기반의 프로그램들을 실행환경에 구별하지 않고 모든 것들을 실행시키는 역할
 
특징

  • 플랫폼에 독립적
  • GC(Garbage Collection) : C에서 malloc(), free()통해 메모리를 수동적으로 관리했지만, Java에서는 자동으로 메모리를 관리
  • Stack기반의 가상머신
       - JVM 구조 - 
 
구성
  • Java Compiler에 의해 .java파일은 Byte Code인 .class파일로 변환
  •    Class Loader JVM에서 실행할 클래스 파일의 내부 구조를 분석
  •       Excution Engine은 클래스 로더를 통해 JVM내의 Runtime Data Area에 배치된 Byte code들을 명령어 단위로 실행
            -클래스로드가 끝난 후 JVM은 main 메소드를 찾아 지역변수, 객체변수, 참조변수를 스택에 쌓음
      -다음 라인을 진행하면서 상황에 맞는 작업 수행(함수 호출, 객체 할당 등)
  •    Runtime Data Area은 JVM메모리로 Java 어플리케이션이 실행하면서 할당받은 메모리영역
  •    PC Register와 두 개의 Stack영역은 각 스레드 별로 생성, 메소드 Area와 Heap는 모든 스레드에 공유
 
런타임 데이터 영역
  • Method 영역 : 모든 스레드가 공유하는 영역으로 JVM이 시작될 때 생성.  GC의 대상
                        저장되는 정보는 Type의 Byte Code, 모든 변수, 상수, Reference, Method Data 등이 포함
                        Class나 Instance, Interface의 초기화 때 사용되는 Class Variable과 Method와 생성자의 정보도 포함.
  • Runtime Constant Pool : 클래스와 메소드, 필드에 대한 모든 레퍼런스를 저장한다. JVM을 해당 메소드의 실제 메모리 상 주소를 찾아 참조시킴
  • Heap 영역 Thread 고유의 정보는 Stack에 저장, Object와 Array객체만 저장되는 공간이다. 
                        GC의 대상, Memory를 할당하는 Instruction(New, New Array, A New Array, Multi A New Array)으로만 존재

  • JVM Stack영역 : 각 스레드마다 하나씩 존재하며, 스레드가 시작될 때 생성. 스택 프레임이라는 구조체를 저장하는 스택
                            메소드가 호출될 때 필요한 변수들을 스택에 저장, 메소드 실행이 끝나면 스택 반환
                            Stack Frame에는 Method의 파라메터 변수, Local 변수, 연산의 결과 등이 저장됨
                            WAS나 Java Application에서 어떤 문제가 있을 때 ‘kill -3 pid'로 Stack Trace, Stack Dump를 얻어내어 분석함
  • PC Register : 각 스레드마다 하나씩 존재하며, JVM이 현재 수행할 명령어의 주소를 저장하는 레지스터
  • Native Method Stack : Native메소드(자바가 아닌 언어에서 제공되는 메소드,C,C++)를 호출하는 코드를 수행하기 위한 스택. 
                                   Java Stack과 Native Stack이 나뉘어져 있다 하더라도 Java Code를 수행하다 JNI(Java Naming Interface)를 호출하게 되면 Java                             Stack에서 Native Stack으로 Dynamic Linking을 통해 확장할 뿐이다.
    * Native Memory Process의 Memory공간에서 Heap, Method Area 등의 Java Runtime Memory를 뺀 만큼 사용할 수 있다.
      Native Memory가 부족해도 OutOfMemoryError가 발생 될 경우, Java Runtime Memory를 줄이는 것, Native Memory Leak도 의심해 볼 것.

 

반응형

댓글