출처: http://scroogy.springnote.com/pages/897918
스쿨쥐님 자료
자바 가상 머신
-
자바 가상 머신이란?
-
기본적으로 컴퓨터의 CPU는 대수 계산, 메모리 접근 제어, 프로그램 흐름 제어, 시스템에 연결되어 있는 하드웨어에 접근하는 방법 등의 기본 기능들이 제공되어야한다. 모든 CPU들이 본질적으로 같은 작업을 수행한다고 해도, CPU의 종류마다 그 작업을 수행해주는 방법이 서로 다르다. CPU에 대해서 추상화를 해주고, 각각의 컴퓨터에서 추상화된 CPU를 구현을 한다면 그 추상화된 컴퓨터(CPU) 위에서 작성된 프로그램은 모든 컴퓨터에서 실행될 수 있다. 이러한 아이디어에서 나온 가상의 컴퓨터(CPU)를 Java Virtual Machine(JVM) 이라고 부른다.
-
-
Java Virtual Machine Specification 내용
-
명령어들의 집합과 각 명령어의 의미에 대한 정의
- 일반적인 CPU는 메모리를 바이트의 배열로 인식하고, 함수를 호출하기 위해서는 해당 함수가 위치한 메모리 번지로 점프
- JVM은 바이트 수준의 메모리 접근을 허용하지 않는다. 대신 객체를 할당해 주고, 메서드를 호출하고, 객체의 필드들을 검색하고 수정해 주는 명령어들을 제공해 준다. (포인터 연산 불가능)
-
class 파일 형식(바이너리 형식)
- 클래스를 바이트 스트림으로 표현한다.
- 자바 플렛폼은 class 파일을 JVM에서 사용되는 클래스로 바꾸어주는 방법을 제공한다. (핵심은 ClassLoader 클래스)
-
검증 알고리즘(프로그램이 문제가 없는지 확인하는 알고리즘)
- 스택 오버플로우, 접근할 수 없는 메모리 영역 접근 시도, 객체를 부적합한 타입으로 캐스팅, 금지된 메모리 영역의 포인터 값 얻어내기 등의 악의적인 접근에 대해서 검사를 한다.
-
검사를 만족시키지 않으면 실행하지 않으며, 시스템에 해를 끼칠수 없게 한다.
-
-
Runtime Data Area
-
자바 프로그램이 실행하는 동안 사용하는 데이터 저장 영역이며, 모든 런타임 데이터 영역은 JVM이 실행되는 동안 만들어졌다가 JVM이 종료되면 모두 사라진다. 또한, 각각의 런타임 데이터 영역은 스레드 단위로 구분되며 스레드가 생길 때 만들어지고 스레드가 끝나면 사라진다.
-
Method Area
- UNIX 프로세스의 "text" segment와 유사한 영역이다.
- JVM이 시작될 때 생성되며, JVM의 모든 스레드들이 공유한다.
-
시스템에 로드된 클래스에 대한 정보를 저장한다. (class 파일 구조 참조)
-
- 런타임 상수 풀
- 필드 및 메서드 목록(생성자와 static 메서드도 메서드 목록에 포함된다.)
- 생성자와 메서드의 Code
- 해당 클래스에서 사용되는 인스턴스 초기화와 인터페이스 초기화에 관한 특별한 메서드들
-
논리적으로 힙 영역의 일부이긴 하지만 GC나 압축(compact)의 대상이 아니다.
- 클래스가 더 이상 사용되지 않으면 메모리 상에서 제거될 것이다.
-
스쿨쥐의 생각
-
Runtime Constant Pool
- 각 클래스나 인터페이스 단위로 class 파일의 constant_pool의 내용을 나타낸다.
- 각 클래스나 인터페이스가 생성될 때 만들어지며, Method Area에 할당된다.
-
클래스에서 쓰일 상수들을 저장한다.
-
Java Virtual Machine Stack
-
메서드가 호출될 때마다, 스택 프레임(stack frame)이라고 불리는 새로운 데이터 영역이 생성된다.
- 스택 프레임이 모여 자바 스택(java stack)을 생성한다.
- 스택의 최상단에 존재하는 스택 프레임은 활성화된 스택 프레임(active stack frame)이라고 부른다.
-
스택 프레임의 구조
- 피연산자 스택(operand stack)
- 지역 변수(로컬 변수)들을 저장하는 배열
- 현재 실행중인 명령어를 나타내는 포인터인 프로그램 카운터(program counter, PC)
-
실행 순서
- 프로그램이 수행될 때는 활성화된 프레임의 피연산자 스택과 지역 변수 배열만 사용된다.
- 메서드가 호출되면, 새로운 자바 스택 프레임이 생성되고, 새로 생성된 프레임이 자바 스택의 최상단으로 오게된다.
- 이전의 자바 스택 프레임에서는 모든 변수들과 프로그램 카운터를 저장한다.
- 새로운 자바 스택 프레임은 자기 자신의 프로그램 카운터를 생성하고, 이 카운터는 호출된 메서드의 시작 부분을 가리키게 된다.
- 호출된 메서드가 종료되면 최상단 스택 프레임은 없어지며, 아래쪽에 있는 스택 프레임이 다시 활성화된 스택 프레임이 된다.
-
이 스택 프레임에서 프로그램 카운터는 메서드를 호출한 명령어의 다음 명령어를 가리키고 있을 것이고, 프로그램은 메서드를 호출한 부분의 다음부터 수행한다.
-
스쿨쥐의 생각
-
정확하게는 블락 "{}" 이 정의될 때 스택 프레임이 생긴다. 그 중 대표적인 것이 메서드 호출이다.
-
-
-
Heap
-
Native Method Stack
- JVM 명령어들이 아닌 다른 언어를 사용해서 구현된다.
- 자바만으로는 할 수 없는 일, 예를 들어 플랫폼에 독립적인 인터페이스를 제작하는 일들을 다른 프로그래밍 언어를 사용하여 처리할 수 있도록 해 준다.
- 네이티브 메서드가 기계어 코드로 컴파일되면, 자신의 상태를 기록하는 스택이 필요로 하고, JVM은 네이티브 메서드들이 사용할 수 있는 네이티브 메서드 스택을 제공해 준다.
- 종종 "C 스택"이라고 불리기도 하는데, 그것은 네이티브 메서드를 작성하는데 C 언어가 가장 일반적으로 사용되기 때문이다.
- 네이티브 메서드는 모든 JVM에 구현되어있는 것은 아니며, 각각의 JVM마다 다른 방식으로 구현되어있기 때문에 항상 이식 가능하지는 않다.
-
JNI(Java Native Interface)를 통해 좀 더 표준적으로 구현할 수는 있지만, 이 또한 항상 사용할 수 있는 것은 아니다.
-
'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 |