자바의 동작원리

황희윤·2023년 5월 26일
0

자바

Oracle 공식 문서에 따르면 Java는 언어인 동시에 플랫폼이다.

인터넷과 컴퓨터 기기의 발달에 따라 다양한 프로그램에 대응해야 할 일은 늘어나는데, 그럴 때마다 새로운 언어를 배우는 것 혹은 기존 프로그램을 새로운 OS에 이식하는 것은 개발자와 회사 입장에서 모두 부담스러운 일이다. 하지만 Java는 사용함으로써 이러한 걱정을 할 필요가 없다. Java 기반 프로그램은 컴퓨터 기계의 구조, OS, 유저 인터페이스와 상관없이 사용할 수 있기 때문이다.

이를 자바의 ‘이식성’ 혹은 '독립성'이라고 일컫는다. (Write once, run anywhere)

Java를 플랫폼에 상관없이 사용할 수 있는 이유는 JVM 덕분이다. JVM이란 자바 가상머신으로, 컴퓨터로 하여금 자바 기반의 프로그램을 실행시킬 수 있게 해주며 프로그램의 메모리도 관리해준다. 자바 이전까지 모든 컴퓨터 프로그램은 특정 OS를 위해 쓰였고 메모리는 개발자들이 관리해야 했다고 한다.

윈도우, 맥, 리눅스 운영체제에서는 주로 그 운영체제의 실행파일(.exe, .app, .sh)들만이 실행 가능하다. 하지만 오라클이 각 운영체제 별로 그에 맞는 JVM을 만들었기 때문에 해당 운영체제에 맞는 JVM을 깔아두면 JVM이 해당 운영체제에서도 돌아갈 수 있도록 만든다.

JVM은 인터프리터와 JIT 컴파일러를 통해 바이트 코드를 각 운영체제에 맞는 기계어로 해석시켜 실행시키고, 가비지 콜렉터를 통해 어플리케이션의 동적 메모리를 관리한다.

📍 인터프리터

  • 바이트코드 명령어를 한 줄씩 읽어서 해석하고 실행한다.
  • 하나씩 해석하고 실행하기 때문에 바이트코드 하나하나의 해석은 빠른 대신 인터프리팅 결과의 실행은 느리다는 단점을 가지고 있다.

📍 JIT(Just-In-Time) 컴파일러

  • 인터프리터의 단점을 보완하기 위해 도입된 것이 JIT 컴파일러이다.
  • 인터프리터 방식으로 실행하다가 적절한 시점에 바이트코드 전체를 컴파일하여 네이티브 코드로 변경하고, 이후에는 해당 메서드를 더 이상 인터프리팅하지 않고 네이티브 코드로 직접 실행하는 방식이다.
  • 네이티브 코드를 실행하는 것이 하나씩 인터프리팅하는 것보다 빠르고, 네이티브 코드는 캐시에 보관하기 때문에 한 번 컴파일된 코드는 계속 빠르게 수행되게 된다.

자바 언어에서 개발자는 .java확장자를 가진 파일에 소스코드를 작성한다. 그러면 자바 컴파일러(javac)가 이를 바이트 코드 파일인 .class파일 컴파일한다. 그럼 JVM이 .class파일을 읽어서 동작 시킨다.

바이트 코드 파일(Byte code)은 완전한 기계어가 아니라서 바로 실행할 수 없고 JVM이 꼭 필요하다.

하지만 가상머신을 사용함으로써 CPU가 직접 실행하는 네이티브 코드보다 약 2.5배 느리다단점이 있다. 그래서 복잡한 프로그램이나 게임에는 적합하지 않다. 또 각 플랫폼의 고유한 기능을 사용하기도 어렵다.


JDK VS JRE VS JVM

JDK(Java Development Kit)

  • 개발자가 자바 기반 애플리케이션 개발을 위해 다운로드하는 소프트웨어 패키지
  • 자바를 이용해 프로그램을 개발하는데 필요한 도구를 모아둔 집합
  • JRE컴파일러, 디버거, 성능 프로파일러가 있다.
  • 무료 버전인 openJDK가 있고, 오라클에서 만든 JVM 성능이 좋은 OracleJDK가 있다.
  • JDK 디렉토리 구성요소
    • bin : 자바 개발, 실행에 필요한 도구
      • javac : 자바 컴파일러로 소스 코드 ➡️ 바이트 코드 컴파일
      • java : 자바 인터프리터로 컴파일러가 만든 바이트 코드를 해석하고 실행
      • jar : 자바 클래스 파일을 압축한 자바 아카이브 파일(.jar) 생성
      • javap : 역에셈블러로 컴파일된 클래스 파일을 원래의 소스로 변환
    • lib : 런타임에 필요한 라이브러리 클래스들
    • include : 네이티브 코드 프로그래밍에 필요하는 C언어 헤더 파일

JRE(Java Runtime Environment)

  • 자바 런타임 환경은 컴퓨터 운영체제 위에서 실행되면서 자바를 위한 부가적인 서비스를 제공하는 소프트웨어 계층이다.

  • 완성된 프로그램을 실행하는데 필요한 환경으로 JVM 실행에 필요한 라이브러리 및 클래스들을 제공한다.

  • java.lang, java.util, java.sql 등등

JVM(Java Virtual Machine)

  • 자바 가상 머신 : 자바 프로그램을 실행하기 위해 물리적 머신(컴퓨터)과 유사한 머신을 소프트웨어로 구현한 것

  • 자바 코드를 컴파일하여 만들어진 .class 바이트 코드 파일은 JVM이 이해할 수 있는 코드로 JVM은 바이트 코드를 기계어로 변환한다.

  • JVM을 사용하면 하나의 바이트 코드(.class)로 모든 플랫폼에서 동작하도록 할 수 있다.

  • Java는 플랫폼에 의존적이지 않지만, JVM은 플랫폼의존적이라서 리눅스의 JVM과 윈도우의 JVM은 다르다.

  • 자바로 만든 모든 프로그램은 실행하기 위해서 JVM이 있어야 한다.

  • JVM은 두 번의 컴파일 과정때문에 성능 이슈가 있었는데 JIT 컴파일러를 통해 같은 코드를 매번 해석하지 않고, 실행할 때 컴파일을 하면서 해당 코드를 캐싱하면서 성능을 향상 시켰다.

JDK안에 JRE가 있고, 그 안에 JVM이 있다.

profile
HeeYun's programming study

0개의 댓글