일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 백트래킹
- 최소신장트리
- 알고스팟
- VituralBox
- 분할정복
- 이분탐색
- tensorflow
- 이분매칭
- 연속합
- 알고리즘
- Ubuntu64bit
- 축사 배정
- Floyd-Warshall
- 이분 매칭
- 피보나치수열
- 코드그라운드
- 백준
- 쉬운 계단 수
- 네이버 지도 api
- Mysql5.7
- pythonanywhere
- SpringBoot
- 나무자르기
- 세그먼트 트리
- 동적계획법
- 피노나치 수열
- Flpyd-Warshall
- 이친수
- 최소스패닝트리
- 다이나믹 프로그래밍
Archives
- Today
- Total
초보개발자
[JAVA] JVM(Java Virtual Machine) 본문
자바 가상 머신 JVM(Java Virtual Machine)
자바 바이트코드를 실행할 수 있는 주체이다. 일반적으로 인터프리터나 JIT 컴파일 방식으로 다른 컴퓨터 위에서 바이트코드를 실행할 수 있도록 구현되나 자바 프로세서처럼 하드웨어와 소프트웨어를 혼합해 구현하는 경우도 있다. 자바 바이트코드는 플랫폼에 독립적이며 모든 자바 가상 머신은 자바 가상 머신 규격에 정의된 대로 자바 바이트코드를 실행한다. 따라서 표준 자바 API까지 동일한 동작을 하도록 구현한 상태에서는 이론적으로 모든 자바 프로그램은 CPU나 운영 체제의 종류와 무관하게 동일하게 동작할 것을 보장한다.
→ 자바 바이트코드를 OS에 맞게 해석해주는 역할을 한다.
특성
- 스택 기반의 가상 머신
- 단일 상속 형태의 객체 지향 프로그래밍을 가상 머신 수준에서 구현
- 포인터를 지원하되 C와 같은 주소값을 임의로 조작이 가능한 포인터 연산이 불가능
- 가비지 컬렉션 사용
- 모든 기본 타입의 정의를 명확히 함으로써 플랫폼 독립성 보장
- 데이터 흐름 분석에 기반한 자바 바이트 코드 검증기를 통해 스택 넘침, 명령어 피연산자의 타입 규칙 위반, 필드 접근 규칙 위반, 지역 변수의 초기화 전사용 등 많은 문제를 실행 전에 검증하여 실행 시 안전을 보장하고 별도의 부담을 줄여줌
- 명령어에서 스택을 가져올 피연산자의 타입을 명령어에 지정
구조
- Class Loader
- Runtime 시점에 클래스를 로딩하게 해준다. 클래스의 인스턴스를 생성하면 클래스 로더를 통해서 메모리에 로드하게 된다.
- Runtime Data Areas
- JVM이 프로그램을 수행하기 위해 OS로부터 별도로 할당 받은 메모리 공간이다.
- PC Register
- 각 쓰레드 별로 하나씩 존재하며 현재 수행중인 JVM Instruction의 주소를 가짐.
- Native Method를 수행할 때에는 JVM을 거치지 않고 API를 통해 바로 수행하게 됨.
- Java Virtual Machine Stack
- 쓰레드의 수행정보를 프레임을 통해 저장.
- 쓰레드가 시작될 때 생성되며, 각 쓰레드 별로 생성이 되기 때문에 다른 쓰레드에 접근할 수 없음.
- Method 호풀이 종료될 때 Stack point에서 제거되며 메모리 공간이 사라짐.
- Method 정보: Method의 매개변수, 지역변수, 임시변수, 어드레스 등을 저장
- Native Method Stack
- Java 외의 언어로 작성된 네이티브 코드들을 위한 Stack, 즉 JNI(Java Native Interface)를 통해 호출되는 다른 코드를 수행하기 위한 Stack.
- JNI를 이용하여 JVM 내부에 영향을 주지 않기 위함.
- Method Area
- 모든 쓰레드가 공유하는 메모리 영역.
- 클래스, 인터페이스, 메소드, 필드, Static 변수 등의 바이트코드 등을 보관.
- Heap
- 프로그램 상에서 런타임시 동적으로 할당하여 사용하는 영역.
- Class를 이용해 Instance를 생성하면 여기에 저장.
- Execution Engine
- Load된 Class의 바이트코드를 실행하는 런타임 모듈이 바로 Execution Engine이다. 클래스 로더를 통해 JVM 내의 Runtime Data Areas에 배치된 바이트코드는 Execution Engine에 의해 실행, 실행 엔진은 자바 바이트코드를 명령ㅇ어 단위로 읽어서 실행한다.
JVM 사양
- 자바 바이트코드는 주로 자바로 작성된 소스 코드를 컴파일 하여 생성하며 현재 자바 가상 머신의 구조는 자바 언어의 구조를 거의 일대일 반영
- 핫스팟 가상 머신: 이를 통해 인터프리터 등 이전에는 실용적이지 못했던 언어 구현이 실용적
- 클래스 로더: 실행 시 CPU에 독립적인 바이트코드를 생성하고 메모리에 올려서 자바 가상 기계가 빠르게 실행할 수 있는 구조라서 동적인 스크립트 언어 구현에 유용
참고
- 나중에 다시 보기: https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EA%B0%80%EC%83%81_%EB%A8%B8%EC%8B%A0
- https://medium.com/@lazysoul/jvm-%EC%9D%B4%EB%9E%80-c142b01571f2
'Language > JAVA' 카테고리의 다른 글
[JAVA] equals와 equalsIgnoreCase (0) | 2018.03.15 |
---|---|
[JAVA] string에서 char 접근 (0) | 2017.10.28 |
[JAVA] 이차원 배열 선언 (0) | 2017.10.26 |
[JAVA] Stack/Queue/PriorityQueue (0) | 2017.10.26 |
[JAVA] 형변환 기록 (0) | 2017.10.25 |
Comments