일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Math.ceil()
- time complexity
- 백준 17425
- java
- 백준 4375
- 백준 14391
- java 올림
- java 내림
- Math.floor()
- sort
- 백준 18290
- 0으로 채우기
- 프로그래머스 연속된 수의 합 java
- 프로그래머스 숫자의 표현 java
- 백준 15661
- Codility
- 자바
- 프로그래머스 도둑질 java
- 프로그래머스 옹알이 java
- 네트워크
- java 반올림
- Arrays
- 알고리즘
- 백준 16927
- 백준 16935
- 프로그래머스 네트워크 java
- 코딩테스트
- Algorithm
- mysql
- 백준 11723
- Today
- Total
취미처럼
[JAVA] JVM 본문
JVM(Java Virtual Machine)
JVM(Java virtual machine)은 자바를 실행하기 위한 가상 기계라고 할 수 있다.
여기서 가상 기계란 프로그램을 실행하기 위해 물리적 머신과 유사한 머신을 소프트웨어로 구현한 것이라고 해석할 수 있습니다.
JVM은 Java Byte Code를 OS에 맞게 해석해주는 역활을 한다.
Java Compiler가 *.java 파일을 컴파일 하면 .class라는 Java Byte Code로 변환시켜 주며,
Byte Code는 기계어가 아니기 때문에 OS에서 바로 실행 되지 않는다.
이 때 JVM이 OS가 이해할 수 있도록 해석해 준다.
자바로 작성된 어플리케이션은 모두 JVM을 통해서 실행되기 때문에 자바 어플리케이션이 실행되기 위해서는 반드시 JVM이 필요하다.
일반 어플리케이션의 코드는 OS만 거치고 하드웨어로 전달되는데
Java 어플리케이션은 JVM을 한 번 더 거치고 하드웨어에 맞게 완전히 컴파일된 상태가 아니며 실행 시에 해석(interpret)되기 때문에 속도가 느리다는 단점을 가지고 있다.
그러나 Byte Code를 하드웨어의 기계어로 바로 변환해주는 JIT컴파일러와 향상된 최적화 기술이 적용되어서 속도의 격차가 많이 줄었다.
JVM이란?
1. Java Virtual Machine
2. JAVA와 OS 사이에서 중계자 역할
3. JAVA가 OS에 구애받지 않고 재사용을 가능하게 해 줌
4. 메모리 관리 기능(Garbage Collection)
JVM(java.exe)은 무엇을 하는가?
1. 메모리를 할당한다.
2. byte code를 interpreter 형태로 OS에 맞추어 번역, 실행한다.
3. 번역, 실행 시 최적화를 수행한다.
JVM 실행 과정
1. 프로그램이 실행되면 JVM은 OS로부터 프로그램에 필요한 메모리를 할당받는다.
2. 자바컴파일러(JAVAC)가 자바 소스코드(*.java)파일을 컴파일 하여 자바 바이트코드(.class)로 변환시킨다.
3. Class Loader을 통해 class파일들을 JVM으로 로딩한다.
4. 로딩된 class파일들은 Execution engine을 통해 해석된다.
5. 해석된 바이트코드는 Runtime Data Area에 배치되어 실질적인 수행이 이루어지게 된다.
6. 이러한 과정속에서 필요에 따라 JVM은 Thread Synchronization과 GC(Garbage Collection)같은 작업을 수행한다.
JVM구조
프로그램이 실행되면, JVM은 OS으로부터 이 프로그램이 필요로 하는 메모리를 할당받고, JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.
JVM은 크게 3부분으로 나눌 수 있습니다.
클래스 파일을 로딩한 뒤 검증하고 초기화하는 Class loader subSystem,
클래스 파일을 저장하는 Runtime DataArea(이곳은 다시 method area, heap, java stacks, pc registers, native method stacks의 5가지 영역으로 나누어진다),
클래스 파일(바이트코드)를 플랫폼에 맞는 기계어로 변환시켜 실행하는 Execution engine
Class Loader(클래스 로더)
JVM내로 클래스(.class)를 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈이다.
Runtime 시에 동적으로 클래스를 로드한다.
jar파일 내 저장된 클래스들을 JVM위에 탑재하고, 사용하지 않는 클래스들은 메모리에서 삭제한다.
클래스의 인스턴스를 생성하면 클래스 로더를 통해서 메모리에 로드하게 된다.
Execution Engine
Load된 Class의 ByteCode를 실행하는 Runtime Module이 바로 Execution Engine이다.
Class Loader를 통해 JVM 내의 Runtime Data Areas 에 배치된 바이트 코드는 Executin Engine에 의해 실행, 실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행한다.
최초 JVM 이 나왔을 당시에는 Interperter방식(한 줄씩 해석하고 실행)이었기 때문에 속도가 느리다는 단점이 있었지만, JIT complier 방식을 통해 이 점을 보완했다.
JIT(Just In Time)는 ByteCode를 어셈블러 같은 NativeCode로 바꿔서 실행이 빠르지만 역시 변환하는데 비용이 발생했고, 이 같은 이유 때문에 JVM은 모든 코드를 JIT Compiler 방식으로 실행하지 않고 Interpreter 방식을 사용하다 일정한 기준이 넘어가면 JIT Compiler 방식으로 실행한다.
Runtime Data Areas
JVM이 프로그램을 수행하기 위해 os로부터 별도로 할당받는 메모리 공간이다. Runtime Data Areas는 크게 5가지 영역으러 나누어진다.
1. PC Register
Thread가 시작될 때 생성되며 생성될 때마다 생성되는 공간으로 스레드마다 하나씩 존재한다.
Thread가 어떤 부분을 어떤 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행중인 JVM명령의 주소를 갖는다.
만약 Native Method를 수행한다면 PC Register은 Undefined상태가 된다.
PC Register에 저장되는 Instruction의 주소는 Native Pointer일 수도 있고 Method ByteCode일 수도 있다.
Native Method를 수행한다면 JVM을 거치지 않고 API를 통해 바로 수행된다.
2. Java Virtual Machine Stack
프로그램 실행과정에서 임시로 할당되었다가 메소드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 영역이다.
각종 형태의 변수나 임시 데이터, 스레드나 메소드의 정보를 저장한다.
메소드 호출 시마다 각각의 스택프레임(메서드만을 위한 공간)이 생성된다. 메서드 수행이 끝나면 프레임 별로 삭제를 한다.
메소드 안에서 사용하는 값(local variable)을 저장한다.
또 호출된 메소드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장한다.
3. Native Method Stack
Java 외의 언어로 작성된 네이티브 코드들을 위한 Stack, 즉 JNI(Java Native Interface)를 통해 호출 되는 C/C++등의 코드를 수행하기 위한 Stack
자바 프로그램이 컴파일 되어 생성되는 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역이다.
4. Method Area( = Class area = Static area)
모든 쓰레드가 공유하는 메모리 영역이다.
Method Area는 클래스, 인터페이스, 메소드, 필드, Static 변수 등의 바이트 코드 등을 보관한다.
자바 프로그램은 main 메소드의 호출에서부터 계속된 메소드의 호출로 흐름을 이어가기 때문이다.
대부분 인스턴스의 생성도 메소드 내에서 명령하고 호출한다. 사실상 컴파일 된 바이트코드의 대부분이 메소드 바이트코드이기 때문에 거의 모든 바이트코드가 올라간다고 봐도 상관없다.
이 공간에는 Runtime Constant Pool 이라는 별도의 관리 영역도 함께 존재한다.
이는 상수 자료형을 저장하여 참조하고 중복을 막는 역할을 수행한다.
1) Field Information : 멤버변수의 이름, 데이터 타입, 접근 제어자에 대한 정보
2) Method Information : 메서드의 이름, 리턴타입, 매개변수, 접근제어자에 대한 정보
3) Type Information :
- Type의 속성이 Class인지 Interface인지의 여부 저장
- Type의 전체이름(패키지명+클래스명)
- Type의 Super Class의 전체이름(단, Type이 Interface이거나 Object Class인 경우 제외)
- 접근 제어자 및 연관된 interface의 전체 리스트 저장
4) 상수 풀(Constant Pool)
- Type에서 사용된 상수를 저장하는 곳(중복이 있을 시 기존의 상수 사용)
- 문자 상수, 타입, 필드, Method의 symbolic reference(객체 이름으로 참조하는 것)도 상수 풀에 저장
5) Class Variable
- Static 변수라고도 불림
- 모든 객체가 공유 할 수 있고, 객체 생성 없이 접근 가능
6) Class 사용 이전에 메모리 할당
- final class 변수의 경우(상수로 치환되어) 상수 풀에 값 복사
5. Heap
객체를 저장하는 가상 메모리 공간, 프로그램 상에서 런타임시 동적으로 할당하여 사용하는 영역이다.
*.class를 이용해 instance를 생성하면 Heap에 저장된다.
new 연산자로 생성된 객체와 배열을 저장한다.
힙은 세 부분으로 나눌 수 있다.
1) Permanent Generation
- 생성된 객체들의 정보의 주소 값이 저장된 공간
2) New Area
- Eden : 객체들이 최초로 생성되는 공간
- Survivor : Eden에서 참조되는 객체들이 저장되는 공간
3) Old Area :
- New Area에서 일정시간이상 참조되고 있는 객체들이 저장되는 공간
'JAVA > 이론' 카테고리의 다른 글
[JAVA] 정규식 (0) | 2021.03.22 |
---|---|
[JAVA] 날짜, 시간 (0) | 2021.03.22 |
[JAVA] StringBuffer, StringBuilder (0) | 2021.03.22 |
[JAVA] Math.ceil() / Math.floor() / Math.round() (올림/내림/반올림) (0) | 2021.02.08 |
[JAVA] 형변환(String to int, int to String) (0) | 2021.02.08 |