====== JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. ====== ===== JVM 이란 무엇인가 ===== * 기술적 정의 : 코드를 실행하고 해당 코드에 대해 런타임 환경을 제공하는 소프트웨어 프로그램에 대한 사양( Specification )이다.\\ * 일반적 정의 : 자바 프로그램을 실행하는 방법. JVM의 설정을 구성하고, 설정사항에 따라 실행 중에 프로그램 리소스를 관리한다.\\ ===== 컴파일 하는 방법 ===== * 작성한 .java파일의 해당 경로를 찾아가서 javac 명령어에 java클래스 명을 작성한다. ex) javac HelloWorld.java ===== 실행하는 방법 ===== ===== 바이트코드란 무엇인가 ===== * JVM이 이해할 수 있는 언어로 변환된 자바 소스 코드를 의미 * 자바 컴파일러에 의해 변환되는 코드의 명령어 크기가 1바이트라서 자바 바이트 코드라고 불리고 있습니다. * 자바 바이트 코드의 확장자는 .class이다. * 자바 바이트 코드는 자바 가상 머신만 설치되어 있으면, 어떤 운영체제에서도 실행될 수 있다. ===== JIT 컴파일러란 무엇이며 어떻게 동작하는지 ===== * JIT ( Just In Time ) 컴파일러는 바이트코드를 기계어로 변환하여 실행 * 인터프리터의 단점을 보완하는 역할, 반복되는 코드가 있다면 어느 시점에 전체 바이트 코드를 컴파일해 네이티브 코드로 변환한다. * 이 네이티브 코드는 반복되는 메소드 호출에 사용되어 시스템 성능을 향상시킨다. ===== JVM 구성 요소 ===== JVM의 3가지 주요 구성 요소 - 클래스 로더 ( Class Loader ) * JAM 구성의 첫 번째 주요 요소이며, 클래스 파일을 Runtime Data Area에 적재하는 역할을 수행하고, 동적으로 클래스를 로딩한다. * 3 단계 - Loading - 부트스트랩 클래스 로더(Bootstrap class loader) : - 익스텐션 클래스 로더(Extension class loader) : - 응용 프로그램 클래스 로더( Application class loader) : - Linking - 확인( verify ) 단계 : 클래스 파일이 메모리에 로드될 때 확인 단계로 들어서며, 이 단계에서 표준에 적합한 경우 바이트코드가 확인된다. - 준비( prepare ) 단계 : 메모리가 스태틱 변수에 할당되고, 디폴트 값이 할당된다. - 해결( resolve ) 단계 : 모든 상징적 참조( symbolic references )가 실제 참조( actual references )로 교체된다. - 초기화( Initialization ) : 클래스 로더 요소의 초기화 단계에서, 모든 스태틱 변수들은 실제 값으로 할당되고, 이때 스태틱 이니셜라이저를 실행한다.\\ - 런타임 데이터 에어리어 ( Runtime data area ) : 클래스 파일을 저장 및 실행 - METHOD AREA - HEAP AREA - STACK MEMORY - PC REGISTER - NATIVE METHOD STACK \\ - JVM 엑씨큐션 엔진 ( JVM Execution Engine ) : 바이트 코드를 기계코드로 변환하고, 명령을 수행하는 실제 엔진이다. - INTERPRETER : 클래스 파일 또는 바이트코드를 읽고, 하나 씩 실횅한다. 인터프리터의 문제는 메서드가 여러 번 호출되면 반복해서 바이트 코드로 인식된다. - JIT COMPILER - GARBAGE COLLECTOR - JAVA NATIVE METHOD INTERFACE - ===== JDK 와 JRE의 차이 ===== ^ JRE ^ JDK ^ | Java Runtime Environment | Java Development Kit | | Java 프로그램을 실행하는 Java Virtual Machine( 자바 가상 머신 )을 구현하는 환경 | Java 기반 응용 프로그램을 개발하는데 사용할 수 있는 소프트웨어 번들 | | Java 프로그램을 실행하는데 필요한 플러그인 | Java 프로그램 개발에 필요 | | JRE는 JDK보다 크기가 작기 때문에 더 적은 디스크 공간이 필요 | JDK는 다양한 개발 도구와 JRE를 포함하므로 더 넓은 디스크 공간이 필요 | | JRE는 JVM, 코어 라이브러리, 그리고 Java로 작성된 응용 프로그램과 애플릿을 실행하는 추가구성요소를 포함 | JDK는 JRE, API 클래스 집합, Java 컴파일러, Webstart 및 Java 애플릿과 응용 프로그램을 작성하기 위해 필요한 추가 파일을 포함 | ==== Ref ==== [[https://java.com/en/download/help/techinfo.html|Where can I get technical information about Java?]] \\ [[https://www.java.com/ko/download/help/techinfo.html|Java에 관한 기술 정보는 어디서 확인할 수 있읍니까?]] \\ [[http://www.tcpschool.com/java/java_intro_programming|자바 프로그램의 실행 과정]] \\ [[https://www.youtube.com/watch?v=QHIWkwxs0AI|JVM ARCHITECTURE]] \\ [[https://steady-snail.tistory.com/67|JVM 동작원리 및 기본개념]] \\ [[https://gaemi606.tistory.com/66|자바 가상 머신 JVM(Java Virtual Machine]] \\ [[https://blog.naver.com/hsm622/222138523668|https://blog.naver.com/hsm622/222138523668]] \\ [[https://jeongjin984.github.io/posts/JVM/|https://jeongjin984.github.io/posts/JVM/]] \\ [[https://github.com/league3236/startJava/blob/master/live_study/week1.md|https://github.com/league3236/startJava/blob/master/live_study/week1.md]] \\ [[https://sowhat4.tistory.com/61|https://sowhat4.tistory.com/61]] \\ [[https://github.com/yeo311/java-study-with-whiteship/tree/main/week1|https://github.com/yeo311/java-study-with-whiteship/tree/main/week1]] \\ [[https://gblee1987.tistory.com/173|https://gblee1987.tistory.com/173]] \\ [[https://github.com/kksb0831/Practice_project/blob/master/Java_Study_01.md|https://github.com/kksb0831/Practice_project/blob/master/Java_Study_01.md]] \\ [[https://jul-liet.tistory.com/143|https://jul-liet.tistory.com/143]] \\ [[https://hoooooooooooooop.tistory.com/entry/javahalle1|https://hoooooooooooooop.tistory.com/entry/javahalle1]] \\ [[https://velog.io/@jaden_94/1%EC%A3%BC%EC%B0%A8-%ED%95%AD%ED%95%B4%EC%9D%BC%EC%A7%80|https://velog.io/@jaden_94/1%EC%A3%BC%EC%B0%A8-%ED%95%AD%ED%95%B4%EC%9D%BC%EC%A7%80]] \\ [[https://catch-me-java.tistory.com/9|https://catch-me-java.tistory.com/9]] \\ [[https://catch-me-java.tistory.com/10|https://catch-me-java.tistory.com/10]] \\ [[https://catch-me-java.tistory.com/11|https://catch-me-java.tistory.com/11]] \\ [[https://catch-me-java.tistory.com/12?category=438116|https://catch-me-java.tistory.com/12?category=438116]] \\ [[https://catch-me-java.tistory.com/13|https://catch-me-java.tistory.com/13]] \\ [[https://docs.google.com/presentation/d/1nTUGhSAQJnlcYTdyH4GXjHQq9w1vFByqAdG71Fbnesc/edit?usp=sharing|https://docs.google.com/presentation/d/1nTUGhSAQJnlcYTdyH4GXjHQq9w1vFByqAdG71Fbnesc/edit?usp=sharing]] \\ [[https://blog.naver.com/baekseongsa/222139174854|https://blog.naver.com/baekseongsa/222139174854]] \\ [[https://blog.naver.com/baekseongsa/222144525963|https://blog.naver.com/baekseongsa/222144525963]] \\ [[https://blog.naver.com/baekseongsa/222144528643|https://blog.naver.com/baekseongsa/222144528643]] \\ [[https://github.com/kyu9/WS_Study/blob/master/week1/day1.md|https://github.com/kyu9/WS_Study/blob/master/week1/day1.md]] \\ [[https://www.notion.so/1-01b08b753f0c4e93b16a96101c75d382|https://www.notion.so/1-01b08b753f0c4e93b16a96101c75d382]] \\ [[https://blog.naver.com/haena910/222150168303|https://blog.naver.com/haena910/222150168303]] \\ [[https://github.com/Jason-time/java_study_with_whiteship/blob/main/week01.md|https://github.com/Jason-time/java_study_with_whiteship/blob/main/week01.md]] \\ [[https://gintrie.tistory.com/61|https://gintrie.tistory.com/61]] \\ {{tag>jvm}}