즉 ! OS에 종속받지않고 CPU가 java를 인식 또는 실행할 수 있도록 하는 가상 컴퓨터입니다 !
Java의 소스코드는 원시코드(.java)로서 CPU가 인식을 하지 못하기기 때문에 기계어로 컴파일을 해줘야합니다. 그러나 Java는 JVM을 거쳐 OS에 도달하기 때문에 OS가 인식할 수 있는 기계어로 바로 컴파일 되는것이 아니라 .class라는 Java bytecode로 변환됩니다.
Java compiler 가
.java
파일을.class
라는 Java bytecode로 변환합니다.
변한된 .class 파일은 OS에서 바로 실행될 수 없고 JVM을 통해서 실행될 수 있습니다.
이처럼 JVM을 통해 어느 OS에서든 Java파일을 실행할 수 있습니다.
자바 컴파일은 .java 파일을 .class 파일로 만들어 주는 과정입니다.
JDK를 설치하면 bin폴더에 javac.exe라는 형태로 설치됩니다.
javac 명령어를 사용하면 .java → .class 파일로 컴파일 할 수 있습니다.
public class transform {
public static void main(String[] args) {
System.out.println("java transform to class");
}
}
"java transform to class"를 출력하는 .java 파일을 생성 후 이를 .class 파일로 변환하는 과정을 예시로 들어보겠습니다.
cmd
창을 열고 해당 .java
파일이 있는 곳으로 이동합니다. C:\Users\pcuser\BabyLion_projectsjavac
명령어로 컴파일을 진행합니다. C:\Users\pcuser\BabyLion_projects javac transfrom.javaJVM 은 크게 Class Loader, Execution Engine, Runtime Data Area, Garbage Collector로 구성되어 있습니다 .
Class Loader는 VM으로 클래스 파일을 로드시키는 역할을 담당합니다. 모든 클래스 파일을 한 번에 메모리에 올리는게 아니라 필요할 때마다 동적으로 올려줍니다. Class Loader는 로딩(클래스 읽기) -> 링킹(레퍼런스 연결) -> 초기화의 단계로 동작합니다.
로드된 바이트코드를 실행하는 파트가 Execution Engine입니다.
Runtime Data Area란, JVM이 프로그램을 수행하기 위해 OS로부터 할당받은 메모리 영역입니다. 제가 좀 더 자세하게 공부했던 부분은 Heap 영역입니다. Heap 영역은 Object 클래스를 상속받는 모든 객체들(클래스 인스턴스들)과 해당 인스턴스의 변수들을 담는 공간입니다. Heap 영역은 JVM 시작시 생성되며 종료시 소멸됩니다.
가비지 컬렉션은 자바의 메모리 관리 방법 중의 하나로 JVM의 Heap 영역에서 동적으로 할당했던 메모리 영역 중 필요 없게 된 메모리 영역을 주기적으로 삭제하는 프로세스입니다.
**가비지 컬렉션 동작 과정에 대해 살펴보겠습니다** 참고자료 : https://coding-factory.tistory.com/829
객체가 처음 생성되고 Heap영역의 Eden에 age-bit 0으로 할당됩니다. 이 age-bit은 Minor GC에서 살아남을 때마다 1씩 증가하게 됩니다. Minor GC 는 JVM 의 Young 영역에서 일어나는 GC 입니다.
시간이 지나 Heap Area의 Eden 영역에 객체가 다 쌓이게 되면 Minor GC가 한번 일어나게 되고 참조 정도에 따라 Servivor0 영역으로 이동하거나 회수됩니다.
계속해서 Eden 영역에는 신규 객체들이 생성됩니다 . 이렇게 또 Eden영역에 객체가 다 쌓이게 되면 Young Generation 영역에 있는 객체들은 비어있는 Survival인 Survival1 영역에 이동하고 살아남은 모든 객체들은 age가 1씩 증가합니다.
또 다시 Eden 영역에 신규 객체들로 가득 차게 되면 다시한번 minor GC가 일어나고 Young Generation 영역에 있는 객체들을 비어있는 Survival인 Survival0으로 이동시킨 뒤 age를 1 증가시킵니다. 이 과정을 계속 반복합니다.
이 과정을 반복하다 보면 age bit가 특정 숫자 이상으로 되는 경우가 발생합니다. 이때 JVM에서 설정해놓은 age bit에 도달하게 되면 오랫동안 쓰일 객체라고 판단하고 Old generation 영역으로 이동시킵니다. 이 과정을 프로모션 이라고합니다.