IT_Programming/Java

[펌] 자바 가상 머신이란?

JJun ™ 2008. 7. 27. 21:00

출처: http://scroogy.springnote.com/pages/897918

스쿨쥐님 자료

자바 가상 머신

 

  1. 자바 가상 머신이란?

    • 기본적으로 컴퓨터의 CPU는 대수 계산, 메모리 접근 제어, 프로그램 흐름 제어,  시스템에 연결되어 있는 하드웨어에 접근하는 방법 등의 기본 기능들이 제공되어야한다. 모든 CPU들이 본질적으로 같은 작업을 수행한다고 해도, CPU의 종류마다 그 작업을 수행해주는 방법이 서로 다르다. CPU에 대해서 추상화를 해주고, 각각의 컴퓨터에서 추상화된 CPU를 구현을 한다면 그 추상화된 컴퓨터(CPU) 위에서 작성된 프로그램은 모든 컴퓨터에서 실행될 수 있다. 이러한 아이디어에서 나온 가상의 컴퓨터(CPU)를 Java Virtual Machine(JVM) 이라고 부른다.   

       

  2.  Java Virtual Machine Specification 내용

    1. 명령어들의 집합과 각 명령어의 의미에 대한 정의

      1. 일반적인 CPU는 메모리를 바이트의 배열로 인식하고, 함수를 호출하기 위해서는 해당 함수가 위치한 메모리 번지로 점프 
      2. JVM은 바이트 수준의 메모리 접근을 허용하지 않는다. 대신 객체를 할당해 주고, 메서드를 호출하고, 객체의 필드들을 검색하고 수정해 주는 명령어들을 제공해 준다. (포인터 연산 불가능)
    2. class 파일 형식(바이너리 형식)

      1. 클래스를 바이트 스트림으로 표현한다. 
      2. 자바 플렛폼은 class 파일을 JVM에서 사용되는 클래스로 바꾸어주는 방법을 제공한다. (핵심은 ClassLoader 클래스)
    3. 검증 알고리즘(프로그램이 문제가 없는지 확인하는 알고리즘)

      1. 스택 오버플로우, 접근할 수 없는 메모리 영역 접근 시도, 객체를 부적합한 타입으로 캐스팅, 금지된 메모리 영역의 포인터 값 얻어내기 등의 악의적인 접근에 대해서 검사를 한다. 
      2. 검사를 만족시키지 않으면 실행하지 않으며, 시스템에 해를 끼칠수 없게 한다. 

         

  3. Runtime Data Area

    • 자바 프로그램이 실행하는 동안 사용하는 데이터 저장 영역이며, 모든 런타임 데이터 영역은 JVM이 실행되는 동안 만들어졌다가 JVM이 종료되면 모두 사라진다. 또한, 각각의 런타임 데이터 영역은 스레드 단위로 구분되며 스레드가 생길 때 만들어지고 스레드가 끝나면 사라진다.  

       

    1. Method Area

      1. UNIX 프로세스의 "text" segment와 유사한 영역이다.
      2. JVM이 시작될 때 생성되며, JVM의 모든 스레드들이 공유한다.
      3. 시스템에 로드된 클래스에 대한 정보를 저장한다. (class 파일 구조 참조)

        1. 런타임 상수 풀
        2. 필드 및 메서드 목록(생성자와 static 메서드도 메서드 목록에 포함된다.)
        3. 생성자와 메서드의 Code 
        4. 해당 클래스에서 사용되는 인스턴스 초기화와 인터페이스 초기화에 관한 특별한 메서드들
      4. 논리적으로 힙 영역의 일부이긴 하지만 GC나 압축(compact)의 대상이 아니다.

      5. 클래스가 더 이상 사용되지 않으면 메모리 상에서 제거될 것이다.
      6. 스쿨쥐의 생각

        • static 변수는 이곳에 직접 값을 지닌다. (static 클래스형 변수는 레퍼런스만 저장되고 실제 객체는 Heap에 있다.)

           

           

    2. Runtime Constant Pool

      1. 각 클래스나 인터페이스 단위로 class 파일의 constant_pool의 내용을 나타낸다.
      2. 각 클래스나 인터페이스가 생성될 때 만들어지며, Method Area에 할당된다.
      3. 클래스에서 쓰일 상수들을 저장한다.

         

    3. Java Virtual Machine Stack

      1. 메서드가 호출될 때마다, 스택 프레임(stack frame)이라고 불리는 새로운 데이터 영역이 생성된다.

      2. 스택 프레임이 모여 자바 스택(java stack)을 생성한다.  
      3. 스택의 최상단에 존재하는 스택 프레임은 활성화된 스택 프레임(active stack frame)이라고 부른다. 
      4. 스택 프레임의 구조

        1. 피연산자 스택(operand stack)
        2. 지역 변수(로컬 변수)들을 저장하는 배열 
        3. 현재 실행중인 명령어를 나타내는 포인터인 프로그램 카운터(program counter, PC) 
      5. 실행 순서

        1. 프로그램이 수행될 때는 활성화된 프레임의 피연산자 스택과 지역 변수 배열만 사용된다. 
        2. 메서드가 호출되면, 새로운 자바 스택 프레임이 생성되고, 새로 생성된 프레임이 자바 스택의 최상단으로 오게된다. 
        3. 이전의 자바 스택 프레임에서는 모든 변수들과 프로그램 카운터를 저장한다. 
        4. 새로운 자바 스택 프레임은 자기 자신의 프로그램 카운터를 생성하고, 이 카운터는 호출된 메서드의 시작 부분을 가리키게 된다. 
        5. 호출된 메서드가 종료되면 최상단 스택 프레임은 없어지며, 아래쪽에 있는 스택 프레임이 다시 활성화된 스택 프레임이 된다. 
        6. 이 스택 프레임에서 프로그램 카운터는 메서드를 호출한 명령어의 다음 명령어를 가리키고 있을 것이고, 프로그램은 메서드를 호출한 부분의 다음부터 수행한다.

           

           

           

        7. 스쿨쥐의 생각

          • 정확하게는 블락 "{}" 이 정의될 때 스택 프레임이 생긴다. 그 중 대표적인 것이 메서드 호출이다.  

             

    4. Heap

      1. 모든 객체들이 저장되는 공간이다. (인스턴스와 배열)
      2. JVM의 모든 스레드들이 공유하며, JVM이 시작될 때 생성된다.
      3. GC의 대상이 된다.

         

         

         

    5. Native Method Stack

      1. JVM 명령어들이 아닌 다른 언어를 사용해서 구현된다.
      2. 자바만으로는 할 수 없는 일, 예를 들어 플랫폼에 독립적인 인터페이스를 제작하는 일들을 다른 프로그래밍 언어를 사용하여 처리할 수 있도록 해 준다. 
      3. 네이티브 메서드가 기계어 코드로 컴파일되면, 자신의 상태를 기록하는 스택이 필요로 하고, JVM은 네이티브 메서드들이 사용할 수 있는 네이티브 메서드 스택을 제공해 준다. 
      4. 종종 "C 스택"이라고 불리기도 하는데, 그것은 네이티브 메서드를 작성하는데 C 언어가 가장 일반적으로 사용되기 때문이다.
      5. 네이티브 메서드는 모든 JVM에 구현되어있는 것은 아니며, 각각의 JVM마다 다른 방식으로 구현되어있기 때문에 항상 이식 가능하지는 않다. 
      6. JNI(Java Native Interface)를 통해 좀 더 표준적으로 구현할 수는 있지만, 이 또한 항상 사용할 수 있는 것은 아니다.  

         

JVM_메모리_구조.ppt
0.17MB

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

JTabbedPane 에서 탭 스타일 수정하기   (0) 2008.08.20
JDBC를 위한 클래스  (0) 2008.08.01
[펌] MIDI SOUND 생성하기 ▷ J2SE   (0) 2008.07.23
Eclipse SWT Event 정리  (0) 2008.06.27
[펌] Java에서 JavaScript호출하기  (0) 2008.06.21