JVM이란?
- .JAVA로 된 파일을 실행할 수 있는 환경을 제공해주는 소프트웨어
JVM의 이점
- 플랫폼(윈도우, 리눅스 등 OS를 의미함)의 영향을 받지 않는다
어느 OS든 알아서 JVM이 해석을 해주어서 OS에게 해석결과를 알려준다
그럼 JAVA가 아닌언어는 어떻게 동작해?
- C언어를 예로 들어봅시다 .C로 된 파일이 있다면 OS마다 다른 컴파일러가 존재하고 그에 따라 다른 실행파일이 만들어집니다. 이 다른 실행파일들은 서로 다른 OS에서만 실행될 수 있습니다. 즉, 컴파일한 파일, 실행파일만 가지고는 서로 다른 OS에서 실행시킬 수 없다는 의미입니다. .C 파일을 받아서 새로 컴파일하고 새로 실행파일을 만들어주어야합니다
하지만 JAVA는 하나의 .JAVA파일을 컴파일한 .CLASS파일을 어느 OS에서든 실행시킬 수 있죠
- JAVA는 OS에 종속적이지 않습니다. 어느 JVM에서나 동작시킬 수 있죠
하지만 JVM은 OS에 종속적입니다. 리눅스에서깔수있는 JVM이 있고, 윈도우에 맞는 JVM이 있죠
JVM의 동작방식
- OS로부터 메모리를 할당받습니다
- 자바 컴파일러가 .JAVA->.CLASS(바이트코드)로 컴파일합니다
- Class Loader가 1번에서 할당받은 메모리중 일부 영역에 Runtime Data Area로 클래스를 로딩한다.
클래스에 있는 여러 부분들을 적당한 영역에 배치한다
- 로딩된 .class들은 실행엔진을 통해 해석된다
Runtime Data Area
모든 스레드가 공유해서 사용(GC 대상)
- 힙 영역
- 메서드 영역
스레드 마다 하나씩 생성
- 스택 영역
- PC 레지스터
- 네이티브 메서드 스택
- 자바외의 언어로 작성된 네이티브 코드를 실행할때 사용되는 메모리 영역
왜 이건 공유해서 사용하면 안되지?
- 3번과 5번은 둘다 스택영역.. 그래서 그런듯
프로세스 vs 스레드
- 프로세스: 메모리상에서 실행중인 프로그램 ex)메모장 창을 여러번 띄움 -> 여러 프로세스
- 스레드: 프로세스 하나 안에서 실행되는 흐름단위 ex) ui를 그리는 스레드 + 서버통신을 담당하는 스레드를 따로 둬서 둘이 동시에 실행되는것처럼 보이게 하는 것 -> 멀티스레드
JVM Memory Usage
static
static멤버는 언제 생성?
Builder
어떻게 Builder는 체이닝 형태로 값을 주입할 수 있는걸까?
- static class이고, 자신을 return하기 때문에 가능한 것
출처
https://coding-factory.tistory.com/827
https://whitepro.tistory.com/458