일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- vue store
- @Transaction isolation
- Spock Stub
- Spock Spy
- webpack
- mock stub
- 타입스크립트
- docker desktop 대체
- 의존성주입
- mock stub spy
- HTTP란
- nuxtjs/composition-api buildModules
- @Transaction propagation
- Mock vs Stub
- docker desktop 유료화 정책
- Spock Mock
- enum
- frontend
- 공짜로 Docker Desktop같은거 쓰기
- TCP/IP
- Spock Mock Stub Spy
- Vue+Typescript
- ECMAScript
- 트랜잭션 격리
- DI
- TypeScript
- Javascript
- 자바스크립트
- Rancher Desktop설치
- Docker Desktop 쓰고싶다
- Today
- Total
끄적끄적
[JAVA] JVM 동작원리 본문
java 사용해 개발하는 개발자라면 필연적으로 또는 서비스개발자로써 각종 트러블 슈팅이나 여러 상황에 직면했을때 필연적으로 마주하게 되는 JVM(Java Virtual Machine)동작원리에 대해서 정리해 보고자 합니다.
먼저 JVM, JRE, JDK에 대해서 간단하게 정리해보죠.
JVM
JVM은 자바가상머신(Java Virtual Machine)의 약자입니다.
자바프로그램을 컴파일 해서 나온 결과인 바이트코드를 실행시켜주는 역활을 합니다.
JRE
JRE는 자바런타임환경(Java Runtime Environment)의 약자입니다.
JVM을 동작하는데에 필요한 자바 라이브러리들을 담고 있는 역활을 합니다.
JDK
JDK는 자바개발키드(Java Development Kit)의 약자입니다.
JRE()와 JVM, Javac(자바컴파일러), jar(라이브러리,리소스를 하나로 묶어주는 툴), jdb(디버깅툴), appletviewer(자바 애플릿 디버깅툴), apt(어노테이션 툴) 등 자바로 개발 할 수 있도록 여러기능들을 제공하는 역활을 합니다.
JVM 동작원리
우리가 흔히 알고 있는 JVM(Java Virtual Machine)의 구성은 위와 같은 절차로 자바를 실행시킵니다.
천천히 하나부터 보죠
1.자바를 통해 개발을 하고 실행하게 되면 자바 파일은 바이트코드(.class)파일로 컴파일 과정을 거치게 됩니다.
2.바이트코드로 변환된 파일들은 클래스로더를 통해 동적 로딩(Dynamic Loading)을 통해 필요한 클래스를 로딩 및 링크하며 각 런타임데이터 영역에 할당합니다.
3.클래스로더로부터 할당된 바이트코드는 익스큐션 엔진(Execution Engine)을 통해 명령어 단위로 하나씩 가져와 실행합니다.
익스큐션 엔진(Execution Engine)의 동작방식
- 자바 인터프리터: 코드 명령어를 하나씩 읽어서 해석하고 실행합니다. 하나하나의 실행은 빠르나, 전체적인 실행 속도가 느리다는 단점
- JIT 컴파일러: 인터프리터의 단점을 보완하기 위해 도입된 방식으로 바이트 코드 전체를 컴파일하여 바이너리 코드로 변경하고 이후에는 해당 메서드를 더이상 인터프리팅 하지 않고, 바이너리 코드로 직접 실행하는 방식으로 하나씩 인터프리팅하는 것이 아닌 컴파일된 바이너리 코드를 실행하는 것으로 인터프리팅 방식보다 빠름
자바메모리영역
- 메소드 영역: JVM이 읽어 들인 각각의 클래스와 인터페이스에 대한 런타임 메서드 정보, static변수, 메서드의 바이트코드가 할당됨.
- 힙 영역: 인스턴스 또는 객체를 저장하며, 가비지 컬렉션 대상으로 JVM 성능에 대한 이슈에 가장 많이 언급되는 영역.
- 스택 영역: 메서드 호출시에 생성되며 종료시에 같이 제거된다. 지역변수, 매개변수, 리턴값, 참조변수 등이 저장됨.
- PC레지스터: 각 스레드마다 하나씩 존재하며, 스레드 시작시에 생성, JVM이 수행할 명령어의 주소를 저장하는 영역.
- Native 메소드 스택: Java Native Interface 호출 및 종료시 생성 바이트코드가 아닌, 기계어로 작성된 코드를 실행하는 영역.
결론
이번 글을 정리하면서 다시한번 공부가 되었고,
특히 힙메모리의 경우 현업에서 자주 발생하는 이슈이며, 메모리 누수에 대해 어느 부분의 트러블슈팅을 우선시 해야되는지 중요한 이론이기에 잘 기억해 두면 좋을 것 같습니다.
참고
'Back-end > Java' 카테고리의 다른 글
[JAVA] JavaTimeModule 포멧팅 (0) | 2021.11.12 |
---|---|
[JAVA] Enum 삽질기.. (1) | 2021.11.11 |
[JAVA] Spring Boot json Enum json object or jsonvalue (0) | 2021.11.10 |
[JAVA] 의존성 주입(DI) (0) | 2021.05.06 |
[JAVA] spring - IOC,AOP,DI 란? (0) | 2020.04.13 |