일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 네트워크
- 팩토리 패턴
- try-catch
- 기본형 매개변수
- 리버스 프록시
- 빈 타입 조회
- removeAll
- 스프링 싱글톤
- 백준 2164
- 싱글톤 패턴
- @Tranctional
- 쇠막대기
- 참조형 매개변수
- www.naver.com치면 발생하는일
- 자바의 면접
- 스프링 빈
- TCP/IP 4계층
- 팩토리패턴
- Class Loader
- 후위표기식
- 스프링 컨테이너
- SOLID원칙
- mvvm패턴
- k번째큰수
- 전략 패턴
- 백준 1935
- 옵저버 패턴
- 포워드 프록시
- 스프링
- 참조형 반환타입
- Today
- Total
스파이더 웹 개발
JVM 이란? 본문
JVM(Java Virtual Machine)
자바 가상 머신으로 자바 바이트 코드를 실행할 수 있는 주체이며, CPU나 운영체제의 종류와 상관없이 실행이 가능하다
운영체제 위에서 동작하는 프로세스로 자바코드를 컴파일해서 얻은 바이트 코드를 해당 운영체제가 이해할 수 있는 기계어로 바꿔 실행하는 역할을 한다
JVM의 구성으로는 Class Loader, Execution Engine, Garbage Collector, Runtime Data Area로 나뉜다
Class Loader
클래스를 로드해주는 역할을 한다 .java 소스를 컴파일하면 .class파일이 생성된다
생성된 클래스파일들을 엮어서 JVM이 운영체제로부터 할당받은 메모리 영역인 Runtime Data Area로 적재하는 역할을 한다
동적로딩
C언어의 경우 프로그램을 실행시 포함된 모든 코드를 메모리에 다 로드한다. 이를 정적 로딩이라 한다
반면 자바의 경우(static 제외) 클래스를 프로그램 실행시에 로드하는 것이 아닌 호출된 정보가 필요한 시점에 로딩하는데
이를 동적 로딩이라 한다
즉 요청된것만 그 순간에 로드한다
Execution Engine
메모리(RuntimeDataArea)에 할당된 바이트코드를 실행하는 역할을 담당한다
바이트 코드는 인간이 읽을 수 있는 형태로 나타내어지는데, Execution Engine을 통해서 기계가 읽을 수 있는 형태로 바이트코드를 변환해주어야 한다 Execution Engine은 바이트코드를 한 줄 마다 읽으며 변환하는 작업을 거친다.
Execution Engine 구성
Interpreter
바이트코드를 기계가 이해할 수 있도록 네이티브 코드로 바꾸는 작업을 한다
바이트코드 한 줄마다 컴파일하여 변환하는 작업을 하며 중복되는 바이트코드에 대해서도 매번 컴파일을 하면 비효율적이며 Running Time 도 길어진다
이러한 중복되는 바이트코드에 대해서는 JIT 컴파일러를 사용한다
JIT 컴파일러
JIT 컴파일러는 적절한 시간에 전체 바이트 코드를 네이티브 코드로 변경해서 Execution Engine이 네이티브로 컴파일된 코드를 실행하는 것으로 성능을 높이는 방식이다.
Garbage Collector
JVM의 메모리 관리 기법 중 하나로 시스템에서 동적으로 할당됐던 메모리 영역 중에서
필요없어진 메모리 영역을 회수하여 메모리를 관리해주는 기법입니다.
가비지 컬렉션의 과정으로는
GC의 작업을 수행하기 위해 JVM이 어플리케이션의 실행을 잠시 멈추고
GC를 실행하는 쓰레드를 제외한 모든 쓰레드들의 작업을 중단 후
사용하지 않는 메모리를 제거하고 작업이 재개됩니다.
Runtime Data Area
JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다.
이 영역은 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack로 나눌 수 있다.
모든 스레드가 공유해서 사용 (GC의 대상)
- 힙 영역 (Heap Area)
- 메서드 영역(Method Area)
스레드(Thread) 마다 하나씩 생성
- 스택 영역(Stack Area)
- PC 레지스터 (PC Register)
- 네이티브 메서드 스택(Native Method Stack)
메서드 영역 (Method Area)
클래스 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보와 같은 각종 필드 정보들과 메서드 정보, 데이터 Type 정보, Constant Pool, static변수, final class 등이 생성되는 영역입니다.
힙 영역 (Heap Area)
- new 키워드로 생성된 객체와 배열이 생성되는 영역입니다.
- 주기적으로 GC가 제거하는 영역입니다.
스택 영역 (Stack Area)
지역변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값 등이 생성되는 영역입니다.
PC 레지스터 (PC Register)
Thread가 생성될 때마다 생성되는 영역으로 프로그램 카운터, 즉 현재 스레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역입니다.
네이티브 메서드 스택 (Native Method Stack)
자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역이다.
보통 C/C++등의 코드를 수행하기 위한 스택이다.
참조
jvm구조와 자바 런타임 메모리자바 jvm 내부 구조와 메모리구조
'Java' 카테고리의 다른 글
기본형 매개변수, 참조형 매개변수, 참조형 반환타입 (0) | 2022.07.21 |
---|---|
객체지향 프로그래밍 OOP(Object Oriented Programming) (0) | 2022.07.21 |
Parameter와 Arguement의 차이 (1) | 2022.07.20 |
클래스 변수, 인스턴스 변수, 지역 변수 (0) | 2022.07.20 |
런타임 vs 컴파일 타임 (0) | 2022.07.20 |