본문 바로가기
프로그래밍/Java

JVM과 JRE와 JDK를 알아보았다.

by yonmoyonmo 2021. 4. 20.

자바로 프로그램을 사악 짜 보기 앞서서... 자바의 기초를 탄탄히 하고 시작해야 후환이 없으리라 여겨서 스윽 자바의 기본이라 하는 것들을 훑어 보았다. 제일 먼저 자바의 나와바리인 JRE와 JVM부터 알아보았다.

1. JDK, JRE, JVM

JDK : Java Development Kit, 자바 개발 킷, 개발에 필요한 자바 컴파일러 같은 것들과 JRE와 JVM을 포함한다.
JRE : Java Runtime Environment, 자바의 런타임, 개발에 유용한 자바 라이브러리를 잔뜩 담고 있음. 자바
프로그램을 실행만 한다면 JRE만 있어도 된다(JVM이 JRE에 있음).
JVM: Java Virtual Machine, 가상 머신, 자바 바이트코드를 실행함.

출처 : https://www.javacodemonk.com/difference-between-jdk-jre-and-jvm-6380989d

2. 자바 코드의 실행 과정

자바후로그램 -> .java 파일이 javac의 도움으로 .class(바이트코드)로 컴파일 됨 -> 클래스 로더의 도움으로 런타임에 바이트코드를 올림
-> 자바 인터프리터, JIT 의 도움(Execution Engine)으로 네이티브 코드(기계어)로 해석되고 하드웨어에 전해짐

출처 : https://www.geeksforgeeks.org/differences-jdk-jre-jvm/
출처 : https://www.geeksforgeeks.org/differences-jdk-jre-jvm/

3. 자바 Runtime Data Area

https://velog.io/@jsj3282/JVM과-자바-메모리-구조Runtime-Data-Area
출처 : https://sehun-kim.github.io/sehun/JVM/

자바 프로그램을 아무튼 실행하면 JVM이 운영체제에게 빌려온 메모리를 나눠준다. 그 메모리를 잘 쓰기 위해 잘 설계가 되어있다.

Method Area :
static area라고도 하는 부분. static 필드나 메서드도 여기 적어 놓고 쓴다. 온갖 클래스, 인터페이스 등에 대한 정보를 테이블 형태로 담아 놓은 Runtime Constant Pool을 가지고 있다. 요 부분을 참조해서 heap에 객체를 만들고 하기 때문에 아무튼 중요하다.

JVM Stack :
{} 중괄호를 만날 때마다 스택 프레임이라는걸 만들어서 쌓아 둔다. 제일 마지막의 닫는 중괄호 } 를 만나면 프로그램은 더 이상의 스택 프레임이 없어지고 종료된다. 블록 안의 변수들이나 파라미터 등의 뭐 이런 것들과 원시타입 자료형 등이 여기 머물러 있다가 사라진다. 아무튼 작업의 순서를 만들어 주고 . 흔히 말하는 "힙과 스택" 에서 스택 역할을 한다. 

PC Register :
그 레지스터가 아님(CPU그거 아님). 쓰레드의 정보를 담고 있다.

Native Method Stack :
Java Nativa Interface를 위한 영역이다. JNI는 자바로 잘 안되는 부분을 주로 C/C++의 도움을 받아서 어케어케 하게 해준다.

*Tip*
Thread( stack, register, native method stack)가 나뉘어 질 때 스레드의 소속된 친구들은 같이 나뉘어 지지만 힙과 메소드 에어리어는 나눠지지 않는다. 스레드에서 힙에 할당된 뭔가를 바꾸거나 하는 행위는 그래서 조심히 해야한다.

 Heap :
자바 new 연산으로 동적 할당된 객체들이 이 영역에 머물러 있는다. 어쩌다 참조가 끊어진 할당은 자바 Garbage Collector가  주기적으로 해제해 준다. 그리고 힙은 가비지 콜렉터가 돌아다니기 좋게 설계되어 있다.

*Tip*
가비지 콜렉터가 가비지를 치우는 방법 : reachability 라는 개념을 사용한다. 참초가 되는지 안되는지 판단해서 아무도 참조하지 않는 할당이라면 해제해 버리는 것. 참조를 따라가다 보면 JVM Stack에 있거나 Native Method Stack의 JNI에 있거나 Method Area에 static 변수에 있거나 하는데 이 친구들을 root set이라고 한다. root set으로 부터 시작하여 reachability를 판단하여 갈비지를 콜렉팅 한다.

 

 

댓글