ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가
    코딩/Java 2020. 11. 18. 19:04
    SMALL

    목차

    1. JVM이란 무엇인가
    2. 컴파일 하는 방법
    3. 실행하는 방법
    4. 바이트코드란 무엇인가
    5. JIT 컴파일러란 무엇이며 어떻게 동작하는지
    6. JVM 구성 요소
    7. JDK와 JRE의 차이

     


    1. JVM이란 무엇인가

     

    - JVM(Java Virtual Machine)은 쉽게 말하면 자바 프로그램을 실행하는 가상 머신이다.

    조금 더 정확히 말을 하면 컴파일러가 해석한 바이트코드(.class 파일)를 OS에 특화된 코드로 변환(인터프리터 / JIT 컴파일러)하여 실핸한다.

     

    특징으로는 JVM이 있기 때문에 자바라는 언어가 OS에 독립적일 수 있다.

    그래서 자바는 OS에 상관하지 않고 동일한 코드를 짜면 동일한 아웃풋을 기대 할 수 있다.

     

    C언어 같은 경우에는 메모리 관리 직접 해줘야 함에 비해 Java 언어 같은 경우는 JVM 내부에 GC (Gabage Collector)가 존재하여 사용되지 않은 메모리를 정리해서 관리 해준다.

     

    WORA(Write Once, Run Anyware) 어느 운영체제에서건 한 번 작성하면, JVM이 깔려있는 한 실행이 된다.

     

    자바 어플리케이션 실행 순서

     


    2. 컴파일 하는 방법

     

    - 자바 코드를 실행시키기 위해서는 위에 그림처럼 [ .java 파일을 => .class (바이트코드) 로 변환하는 작업(=컴파일)]이 필요하는데 그것을 컴파일러 (javac)가 해준다. 

     

    java 소스 파일

     

    javac xx.java  (복수개도 가능 javac xx.java bb.java )

     

    컴파일 오류

     

    컴파일러를 이용해서 컴파일을 진행했으나 오류.

    친절한 오류 메세지  (MS949 인코딩으로 매핑할 수 없는 문자라는 이다.)

    인코딩 설정을 따로 하지 않으면 MS949로 된다는 것을 알 수 있다.

     

    컴파일 encoding 옵션

    인코딩 옵션을 줘서 UFT-8로 하게 되면 문제 없이 컴파일이 수행되고 .class 파일이 생성이 된다.

     

    그 폴더내에 모든 java 파일을 컴파일 하겠다면

     

    javac *.java 

     

     

     

    ** 추가적으로 라이브 방송 때 백기선님이 언급해주신 부분.

     

    java 14 버전으로 컴파일 된 .class 파일을 java 8이 실행을 시킬 수 있을까? 

    => 정답은 될 수도 있고 안 될 수도 있다.

     

     기본적으로 아무 옵션을 주지 않고 컴파일을 할 경우는 높은 버전에서 컴파일 된 바이트코드는 아래 버전의 자바 에서 구동시킬 수가 없다.

     

     이유는 자바도 버전이 업그레이드 됨에 따라 같은 자바 코드여도 좀 더 최적화되게끔 컴파일러도 업그레이드가 되고 해서 동일한 바이트코드로 변환시켜주지 않을 뿐더러 최적화 된 바이트코드를 해석할 수가 없어서 에러가 날 것이다.

     

    다만 target version이라는 옵션을 사용을 하게 된다면 높은 버전을 낮은 버전이 이해 할 수 있는 코드로 바꿔서 컴파일 해주기에 낮은 버전에서도 오류 없이 실행 할 수가 있다.

     

    ** javac 에 대한 옵션

     

    친절한 -help 옵션

    [주요 명령어]

    명령어 설명
    -g 모든 디버깅 정보를 생성시킵니다.
    만약 위 옵션이 설정되어 있지 않으면, 기본적으로, 라인넘버만 생성시킵니다.
    -g:none: 디버깅 정보를 전혀 생성 시키지 않습니다.
    -g:{lines, vars, source}:
    -verbose 컴파일러가 하는일을 출력합니다.
    -classpath <path>
    -cp <path>
    컴파일을 하기 필요한 클래스 파일들을 찾기 위해 파일 경로를 지정해주는 옵션
    -sourcepath 소스파일의 위치를 설정 합니다.
    -d <directory> 클래스 파일을 생성할 루트 디렉토리를 지정할 수 있다. 기본값은 소스파일이 위치한 곳
    - target <release> 위에서 언급한 버전을 바꿔서 컴파일을 할 수 있다.
    -profile <profile> profile에 따른 properties를 바꿀수 있다.

     

     

    (Mac 관련) javakong.tistory.com/131


    3. 실행 하는 방법

     

    - 위에서 컴파일이 완료된 .class 파일을 실행을 할 것이다.

     

    바이트코드로 컴파일 된 .class 를 java 명령어로 실행 할 수 있다.

     

    java xx(클래스 명)

     

    class 파일 실행

     

    실행이 잘 되는 것을 볼 수 있다.

     

     


    4. 바이트코드란 무엇인가

     

    바이트코드는 특정 하드웨어가 아닌 가상 컴퓨터에서 돌아가는 실행 프로그램을 위한 이진 표현법이다.

    보통의 기계어 보다 추상적이다.

     

    바이트코드는 대부분의 명령 집합이 0개 이상의 매개 변수를 갖는 1바이트 크기의 명령 코드였기 때문에 바이트코드라고 불리게 되었다.

     

     

    바이트코드 해석

     


    5. JIT 컴파일러란 무엇이며 어떻게 동작하는 가

     

    JIT 컴파일러는  .class 파일을 JVM이 실행 할 때 수행 되는 컴파일러이다. Java는 원래 Interpreter (한 줄 읽고 한 줄 실행) 방식인데 이게 속도 느리다보니 그 단점을 보안하기 위해서 JIT (Just in time) 컴파일러가 등장했다.

     

    JIT 컴파일러의 경우 Interpreter가 실행하는 코드 해석을 캐싱하고 있다가 동일한 코드가 들어왔을 때 바로 실행을 시켜줌으로써 동일 동작에 대해 해석을 두 번하지 않는다. 그 결과 속도 향상이 된다.

     


    6. JVM 구성요소

     

    JVM은 크게 Class Loader , Runtime Data Area , Execution Engine 으로 이뤄져있다.

     

    Class Loader는 바이트코드를 해석해서 필요한 Class 들을 메모리에 올리는 역할을 합니다.

     

    Runtime Data Area에는 stack, heap, pc register, native method .. 로 구성되어있다.

     

    execution engine은 실행이 되면서 동작을 함.

     


    7. JDK와 JRE의 차이

     

    JDK / JRE / JVM

     

    JDK (Java Development Kit) 는 자바 어플리케이션을 개발하기 위해서 필요한 것들을 담고 있다.

     

    JRE (Java Run Environment) 는 자바 어플리케이션이 실행되기 위해 필요한 것들을 담고 있다. 

     

    즉 실행만 하기 위해서는 JRE만 다운을 받으면 된다.

     

    Oracle 기준으로 Java 11 부터는 JRE를 따로 제공하지 않는다.

     

    [JDK (javac, jar, javap ..)  , [ JRE (java, javaw, rt.jar, libraries) , [ JVM (JIT Compiler)]]]

     


    8. 출처

     

    ko.wikipedia.org/wiki/%EB%B0%94%EC%9D%B4%ED%8A%B8%EC%BD%94%EB%93%9C - (바이트코드)

    github.com/whiteship/live-study/issues/1

    www.inflearn.com/course/the-java-code-manipulation

    LIST

    댓글

Designed by Tistory.