bdfgdfg
자바 & JVM 본문
자바 언어의 특징
- 운영체제에 독립적 : 자바가상머신(JVM)을 통해 자바로 작성된 프로그램은 운영체제에 독립적이다.
- 객체지향 언어
- 자동메모리관리(Garbage Collection)
JVM(Java Virtual Machine)
자바를 실행하기 위한 가상 기계. 자바로 작성된 애플리케이션은 모두 이 JVM환경에서만 실행되기에 JVM은 필수이다.
자바언어는 다른 어플리케이션과 달리 OS환경에 따라 프로그램을 만들어야하는데(EX C/C++) 자바는 JVM하고만 상호작용을 거치기에 OS에 종속적이게 코드를 작성할 필요가 없다. (단 JVM자체는 OS에 종속적이기에 해당 OS에서 실행가능한 JVM이 필요.)
즉 정리하면 자바 어플리케이션을 어느 CPU나 OS에서도 실행할 수 있게 지원하는 역할을 수행한다.
좀 더 자세히 들어가보자.
자바는 컴파일되는 언어에 속하지만, C/C++처럼 컴파일 후 바로 해당 OS가 읽을 수 있는 기계어로 변환되는게 아닌
위에서 말한 것 처럼 자바 -> JVM -> OS처럼 JVM이라는 중간단계가 하나 더 존재.
그렇기에 자바언어로 작성한 코드를 컴파일하면 자바 바이트코드가 생성이 되는데, JVM은 바이트코드를 해당 OS의 기계어로 변환하여 OS로 전달한다.
자바 어플리케이션의 실행 과정을 정리하면
1. App이 실행되면 JVM이 해당 운영체제로 부터 메모리를 할당받고, JVM은 할당 받은 메모리를 용도에 따라 영역을 나눈다.
2. 자바 컴파일러가 자바 소스코드를 읽어 바이트코드(??.class)로 변환한다.
3. Class Loader를 통해 바이트 코드를 JVM으로 로딩(적재)
4. 로딩된 바이트 코드는 Execution Engine을 통해 해석.
5. 해석된 바이트 코드는 Runtime Data Areas에 배치되어 실행.
-> 실행되는 과정에서 GC등 작업 수행.
JVM의 구성은 크게 4가지.
- Class Loader
- Execution Engine
- Garbage Collector
- Runtime Data Area
1. Execution Engine
Runtime Data Area에 할당된 바이트 코드를 실행시키는 주체이며 코드를 실행하는 방식은 크게 2가지로 나뉜다.
1. 인터프리터(Interpreter) 방식
- 바이트 코드를 해석하여 실행하는 역할을 수행.
- 같은 메소드라도 여러번 호출될 때 매번 새로 수행.
2. JIT(Just In Time) Compiler 방식
- 인터프리터의 단점을 해소
- 반복되는 코드를 발견해 전체 바이트 코드를 컴파일하고 그것은 Native Code로 변경해 사용.
3. Garbage Collector
- 더이상 참조되지 않는 객체. 즉 Garbage를 제거하는 역할을 수행.
--> C/C++과 달리 직접적으로 메모리를 관리하지 않아 편리하지만, GC를 수행하기 위해 JVM이 일시적으로 멈춤.
- 일반적으로 자동으로 수행 (System.gc()를 통해 직접적으로 호출할 수 있으나 실행이 보장되지 않는다)
2. Class Loader
클래스로더는 JVM으로 바이트 코드를 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈.
클래스로더는 코드가 작성된 .java파일을 자바 컴파일러를 통해 컴파일을 하게 되면 .class라는 바이트 코드로 변환.
이 바이트 코더들이 클래스 로더를 통해서 로딩,링킹,이니셜라이제이션을 통해 Runtime Data Area에 적재 된다.
여기서 클래스를 메모리에 올리는 로딩 기능은 한번에 메모리에 올리지 않고, 앱에서 필요한 경우 동적으로 메모리에 적재.
(로딩 : Loading -> Linking -> Initialization)
3. Runtime Data Area
App이 동작하기 위해 os에서 할당받은 메모리 공간을 의미
위와 같이 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack.
Method Area
- static으로 선언된 변수 및 Class레벨의 모든 데이터가 여기에 저장.
- JVM마다 단 하나의 Method Area가 존재.
- Runtime Constant Pool이라는 별도의 영역이 존재
- Filed Info(멤버 변수 이름, 데이터 타입, 접근 제어자 정보), Method Info(메소드 이름, Return 타입, 매개변수), Type Info등.
- Heap과 마찬가지로 GC관리대상.
- 간단히 보면 실행시켜야 할 코드가 존재하는 영역이라고 보면 된다.
Heap Area
- 객체를 저장하기 위한 메모리 영역
- new 연산자로 생성된 모든 Object.
- Heap영역은 물리적으로 Young Generation, Old Generation이 존재.
-> Young Generation : 생명 주기가 짧은 객체를 GC대상으로 하는 영역 -> 오래 사용되는 객체는 Old Generation으로 이동
-> Old Generation : 생명 주기가 긴 객체를 GC대상으로 하는 영역
- Methoad Area와 Heap Area는 스레드간에 공유되는 메모리.
- Static 키워드가 붙은 정적 메모리는 Method Area에. new 키워드가 붙은 동적 메모리는 Heap 영역에 저장.
Stack Area
- 각 스레드마다 독립적으로 존재하는 메모리 공간. (스택 프레임등의 이유로)
- 메소드 호출 시 동일하게 스택 프레임이 생성되며, 그 안에 매개변수, 지역변수등을 할당
PC Register
- 각 Thread가 시작될 때 생성. 현재 실행중인 상태 정보를 저장하는 영역이다. (Thread별로 하나씩 존재)
- 즉 현재 수행중인 부분에 대한 기록.
출처 - https://www.youtube.com/watch?v=zta7kVTVkuk
'웹프로그래밍 > Java' 카테고리의 다른 글
제어자, 캡슐화/은닉성 (0) | 2023.07.26 |
---|---|
package와 import (0) | 2023.07.26 |
자바의 상속,다형성,인터페이스 (0) | 2023.07.26 |
비동기&동기 / 블로킹&논블로킹 IO (0) | 2023.07.26 |
클래스 초기화 (0) | 2023.07.25 |