It is just my opinion, so don't you attack me. please!
But if this posting has some incorrect informations, you comment about that
Please!!
What is JVM?
- Where is JVM?
·JVM
은Application program(응용프로그램)
과OS
사이 존재하게 되며, 하는 일은Java byte code
를 해석하고 실행하는 것이다. 그렇다면JVM
은 언제 설치 되는가?eclipse
나intellij
로Java
를 실행하기 위해 우리는JDK
가 필요하다는 것을JVM
이 궁금한 사람이라면 당연히 알고 있을 것이다.
·JVM
은JRE(Java Runtime Environment)
라는 소프트웨어 패키지에 Java Class library와 함께 구현되어 있다. 또한ORACLE
은 이 JRE를Hotspot
이라 부르며 배포하고 있다.
· 그리고 이JRE
의 Superset(상위 집합)이 바로JDK(Java Development Kit)
인 것이다. 이JDK
에는 Java 프로그래머를 위한 여러가지 툴이 있으며, 가장 중요한javac
라는 compiler를 포함하고 있다.
· OS 위에 바로 응용프로그램을 올리지 않고,virtual machine
을 올리고 이후에 응용프로그램을 올리는 것일까?virtual machine
을 사용하면서 생긴 장단점이 있다.
우선 단점은Java byte code
를JVM
이 기계어로 해석을 해줘야OS
에서 받아들일 수 있기 때문에, 해석에 대한 추가적인 시간이 걸리게된다. 또한System call
이 발생할 때도 시간이 걸리는데,JVM language Stack
에서 수행을 하고 있다가System call
이 필요한 순간이 오면,현재 stack
에서Native method stack
으로 분기하게 된다. 이후OS
에System call
을 하고, 다시 돌아와서 수행을 하는 방식이다. 따라서C/C++
에서 표준 라이브러리로System call
을 하는 방식보다 느릴 수 밖에 없다.
VM
을 사용하면서 얻을 수 있는 장점은 무엇일까?C/C++
의 경우는 플랫폼에 따라int
형의 크기가 변한다. 이런 상황에서 JAVA에서 현재는 그 목적이 흐려졌지만,VM
을 사용하는 목적은WORA(Write Once Run Anywhere)
즉,H/W
나OS
에 영향을 받지 않고Java byte code
를 정확하게 수행하게 되는 것을 지향하기 위해서이다.
하지만 상대적으로 느리다는 단점은JIT(Just In Time)
컴파일러를 구현해 단점을 극복해 냈고,VM
을 사용한 장점을 살린 JAVA는 프로그램의 이식성을 높일 수 있도록 해주고, 유지보수에 들어가는 비용을 줄이거나 없앨 수 있을 것이다. - Structure of the JVM
· Class loader
JDK
의javac(compiler)
가source.java
을 컴파일 하여java byte code
로 된source.class
를 만든다. 그리고 이source.class
를Runtime data area(memory allocated by JVM)
으로 로드하는 역할은Class loader
가 맡게 된다. (class loader에 대해서는 나중에 더 자세하게 포스팅 하도록 하겠습니다.)
· Runtime data
JVM
이 프로그램을 수행하기 위해서OS
로부터 별도로 할당 받은 공간이다.Heap
과Method area(+ runtime constant pool)
은 프로그램이 구동되면서 생긴thread
모두가 공유하는 공간이고, 나머지JVM stack
,PC register
,Native Method
stack
은 thread 별로 공간을 할당 받는다.
· PC register
OS의 PC register와 같은 기능으로 다음JVM
명령
에 대한 주소를 가지고 있다.
· JVM stack
thread에서 사용하는 stack으로stack frame
을POP
하거나PUSH
한다. (JVM stack에 대해서도 더 자세하게 포스팅하도록 하겠습니다.)
· Native Method Stack
JNI(Java Native Interface)
를 통해 호출하는C/C++
등의 코드를 수행하기 위한 스택으로, 언어에 맞게C stack
이나C++ stack
이 생성된다. 또한System call
을 할 때에도 이 곳을 거치게 된다.
· Method(class) Area
이 영역은 논리적으로는Heap의 일부
지만, 모든 thread가 공유하는 공간으로run-time constant pool
,field
,메소드 data
,메소드에 대한 코드
와생성자
, 클래스에서 초기화 및 인터페이스 초기화에 사용되는특별한 메소드
들을 저장합니다.
· Heap
thread 간에 공유되는 영역으로서heap
은 모든class instance
및array에 대한 메모리
가 할당되는run-time data area
이다. 또한JVM
성능 이슈에 가장 많이 언급되며,Garbage collection
의 대상이 되는 곳이다.