일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Spark
- lazy evaluation
- 프로그래머스힙
- 하둡2.0
- 하둡1.0
- 빌드도구
- 카프카
- freenom
- 데이터 수집
- Catalyst Optimizer
- 문맥교환
- 런타임데이터영역
- 하둡에코시스템
- 지연연산
- 실행엔진
- ORACLE문법
- 프로그래머스 큰 수 만들기
- 서버간 복사
- ORACLE MSSQL차이
- 데이터베이스복사
- AWS Crawler
- 데이터엔지니어링
- kafka 설치
- Databricks
- 프로그래머스
- Spark 최적화
- 데이터파이프라인
- EMR 구조
- 스파크
- 하둡
- Today
- Total
띵유로그
[JAVA] JVM이란? - JVM 동작과정 본문
JAVA는 JVM(java virtual machine) 위에서 동작합니다. 그로 인해 OS에 독립적으로 코드를 실행할 수 있습니다.
java소스코드(.java)는 바로 기계어로 번역되는 것이 아니라 JVM 이 해석할 수 있는 방식인 java bytecode(.class) 로 변환됩니다.
JVM 구조는 아래 그림과 같습니다.
JVM 은 크게 CLASS LOADER, 실행엔진, 런타임데이터 영역으로 나뉩니다.
각 구성요소가 어떤 역할을 하는지 알아보기 전에, 소스코드를 JVM 위에 올리는 과정을 먼저 알아보겠습니다.
.JAVA 가 JVM 에서 구동되는 과정
1) 소스코드인 .java를 컴파일하여 바이트코드인 .class로 변환합니다.
컴파일 할 때는 javac 명령어를 통해 javac.exe를 실행시킵니다.
javac는 jdk 에 포함되어있습니다.
.class는 jvm execution engine이 해석할 수 있는 코드입니다.
2) 이제 .class 파일을 이용해서 JVM 위에 구동시킬 것입니다.
구동시킬 때에는 클래스로더와 실행엔진이 필요합니다. (이 두개는 jre 에 포함됩니다.)
2-1) 클래스 로더
로드, 링크(+초기화) 과정을 통해 클래스를 JVM에 올립니다.
[로드 과정]
.class 를 JVM 내로 로드합니다. 즉, 참조할 수 있는 메모리(메소드 영역)로 코드를 올리는 것입니다.
[링크 과정]
읽어온 클래스를 링크합니다.
링크는 "검증 -> 준비 -> 분석" 순서로 시행합니다.
검증 : 클래스가 java명세, jvm 명세에 따라 작성되었는지 검사
준비 : 클래스가 필요로 하는 메모리를 할당& 데이터 구조 준비
분석 : 메모리 레퍼런스를 실제 class의 레퍼런스로 바꿈
[초기화 과정]
각 변수들을 초기화 합니다.
2-2) 실행엔진
- 인터프리터 : 바이트 코드를 각 line 씩 읽고 기계어로 번역합니다. 한 줄 씩 수행하기 때문에 느립니다.
- JIT 컴파일러 : 자주 사용되는 바이트코드를 미리 기계어로 해석해두고 사용합니다. 인터프리터 방식으로 실행하다가 적절한 시점에 (많이 등장하면) 바이트코드 전체를 컴파일해 두고 사용합니다.
- 가비지 콜렉터 : 사용하지 않는 인스턴스를 찾아 메모리에서 삭제합니다.
이 두가지의 과정을 통해서 . java 코드를 바이트코드로 바꾸고, 이를 jvm 위에 올려 코드를 실행합니다.
마지막으로 자바의 RUNTIME DATA 영역까지 알아봅시다.
3) RUNTIME DATA 영역
질문
클래스로더란 무엇인가요?
JVM 에서 런타임에 클래스를 메소드영역으로 올리는 것입니다. 이때 로드, 링크 과정을 거쳐서 jvm의 메소드 영역으로 올립니다.
클래스로더는 어떻게 동작하나요?
클래스로더는 먼저 method 영역에서 클래스가 로드되어있는지 확인합니다. 존재한다면 그대로 사용합니다.
만약 로드되어있지 않다면 부트스트랩클래스로더(JDK/JRE/LIB) -> 확장클래스로더(JDK/JRE/LIB/EXT) -> 시스템클래스로더 순으로 확인하여 클래스가 존재하는지 확인합니다.
클래스가 동적으로 로드하는 방식?
클래스를 로드하는 시점에 다른 클래스를 로드하는 로드타임동적로딩방식,
클래스를 실행하는 시점에 다른 클래스를 로드 하는 런타임동적로딩방식이 있습니다.
* 클래스의 로딩은 thread- safe 하다는 점을 이용해서 싱글톤 객체를 만들 수 있습니다.
참고 블로그)
'CS' 카테고리의 다른 글
[CS] [OS]문맥교환 (0) | 2022.02.09 |
---|---|
프록시 서버 (0) | 2022.01.06 |