온라인 자바 스터디 1주차

wannte·2020년 12월 27일
0
post-thumbnail

JVM이란 무엇인가

Java Virtual Machine의 줄임말로 다음의 두가지의 주요 기능을 가진다.

  1. Java 프로그램들이 디바이스나 운영체제에 관계없이 실행될 수 있게 해준다.

"Write Once, Run Anywhere(WORA)"

Java WORA("Write Once, Run Anywhere"): 가상머신을 컴퓨터 메모리에 구축하였기에 기계나 운영체제와 상관없이 독립적으로 코드를 실행할 수 있음.

Java언어로 오기까지 역사를 살펴보면,

기계어 코딩: 직접 01 만을 조합하여 코딩

어셈블리어 코딩: 어셈블러를 통해 어셈블리어를 기계어로 변환하여 실행. (단점: 기계에 따라 어셈블리어가 영향을 받음.)

C언어 WOCA("Write Once, Compile AnyWhere"): 소스코드만을 작성하면, 기계에 맞는 컴파일러가 기계에 맞는 목적파일을 만들어줌. 작성하고 컴파일하면 어디서든 사용가능하다. (단점: Compile전 운영체제에 맞는 fix source 작업이 추가적으로 필요)

  1. 프로그램 메모리를 관리하고 직접 최적화해준다.

자바 이전까지의 언어들은, 프로그래머가 직접 메모리를 관리했어야만 했다. (ex. C언어에서의 free)
자바에 경우 GC(가비지 컬렉션)을 이용하여 메모리 관리를 해준다.

컴파일 하는 방법

javac [ options ] filename.java ...

컴파일 하게되면 FileName.class라는 파일을 생성한다. (Java source code → Java bytecodes)

다양한 옵션 또한 제공하고 있으며, Intellij에서 parameter들을 추가하려면 Settings > Build, Execution, Deployment > Compiler > Java Compiler > Additional command line parameters. 라고 한다.

실행하는 방법

java [ options ] classname <args>

앞서 컴파일한 java class 파일을 실행시킨다.

java 명령어는 javac로부터 컴파일되어 생성된 classname.class파일에 클래스의 bianry representation이 있기를 기대한다. classname 클래스는 아래와 같이 main 메소드가 정의 되어 있어야 한다.

class Aclass {
       public static void main(String argv[]){ 
           . . .
       }
   }

실행도 다양한 옵션들이 존재하지만 여기선 생략하겠다.

바이트코드란 무엇인가

javac 컴파일러에 의해 JVM에서 실행할 수 있는 언어로 변환된 파일(.class)

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

자바 바이트 코드는 인터프리터 언어이며, 한줄씩 읽고 해석하고 기능을 실행한다. (매우 저수준의 인터프리터 언어기에 자바스크립트에 비하면 빠르지만, 기계어로 컴파일되어 돌아가는 c와 같은 언어들 보다는 실행 속도가 느리다.

이러한 실행 속도의 문제를 해결하기 위해 나온 것이 JIT 컴파일러이다.

런타임 중에, 자바 바이트 코드를 해당 플랫폼에 맞는 기계어로 컴파일 해주는 특수한 컴파일러이다. 추가적으로 바이트 코드를 기계어로 컴파일해주는 시간만큼 프로그램의 실행 시간이 증가하게 되지만, 자주 불려지는 메소드를 JIT 컴팡일러로 컴파일 한다면, 실행 능력을 향상시킬 수 있다.(추가적으로, 최적화 과정을 거친다고 한다.)

JIT 컴파일러 사용 여부는 사용자가 직접 선택할 수 있다. JIT 컴파일러의 사용이 항상 응용 프로그램의 성능을 향상시켜주는 것만은 아니다.

JVM 구성 요소

출처: https://www.guru99.com/java-virtual-machine-jvm.html

  1. ClassLoader

    class 파일을 로딩한다. Loading, Linking, Initialization의 3가지 기능을 수행

  2. Method Area

    JVM에서 읽은 클래스와 인스턴스의 정보가 저장되는 영역. 객체 생성 후에 메소드를 실행하게 되었을 때, 해당 클래스에 대한 정보를 Method Area에 저장하게 됨. 저장되는 내용은 다음과 같다.

    • Type Information : type은 class 와 interface를 통칭.

      type의 전체이름. class/interface 여부, modifier(public,abstract,final),연관된 인터페이스

    • Runtime Constant Pool : 클래스 인터페이스의 메소드, 필드, 상수등의 symbolic reference가 저장됨. Object의 접근 등 모든 참조를 위한 핵심 요소

    • Field information : field의 인스턴스 변수를 가르킨다

      Field Type, Field modifier (public / private / protected / static / final / volatile / transient)

    • Method Information

      모든 메소드의 정보.

    • Class Variable

      static 키워드로 선언된 변수들.

      final class 변수는 상수로 치환되어 Runtime Constant Pool에 값을 복사.

      클래스를 사용하기 이전에 이 변수들은 미리 메모리를 할당 받아 있는 상태가 된다.

      기본형이 아닌 static 클래스형 변수는 레퍼런스 변수만 저장되고 실제 인스턴스는 Heap에 저장됨.

  3. Heap

    사용자가 관리하는 인스턴스가 생성되는 공간.(new) 인스턴스가 heap영역의 메모리에 할당되어 사용되어짐. 레퍼런스 변수의 경우 heap에 인스턴스가 아닌 포인터가 저장이 됨.

    GC(Grabage Collection)의 대상이 되는 여

  4. JVM Language stacks

    로컬 변수와 그 중간 결과값을 저장한다. 각각의 쓰레드는 각 JVM스택을 가지고 있고, 쓰레드가 생성될 때 같이 생성된다. 새로운 메소드가 실행될때, 새로운 프레임이 생성되고, 완료되었을 때 삭제된다.

  5. PC Registers

    JVM instruction이 현재 실행되고 있는 주소를 저장한다. 각 쓰레드는 각자의 PC를 갖는다.

  6. Native Method Stacks

    자바 말고 다른 언어로 작성된 라이브러리코드의 인스트럭션을 관리한다.

  7. Execution Engine

    Load 된 바이트코드를 실행하는 Runtime Module이 Execution Engine(실행 엔진) 이다.

    여기서 interpreter 방식, JIT컴파일 방식 이 두가지를 혼합하여 사용.

  8. Native Method Interface

    Native Method Interface는 프로그래밍 프레임워크다. JVM에서 실행 중인 Java 코드가 라이브러리 및 네이티브 애플리케이션으로 호출할 수 있도록 한다.

  9. Native Method Libraries

    Native Libraries는 실행 엔진에 필요한 Native Libraries(C, C++)의 모음이다.

JDK와 JRE의 차이

JRE : java runtime environment

JDK : java development kit

  • The JVM is the Java platform component that executes programs.

  • The JRE is the on-disk part of Java that creates the JVM.

    (package of tools for running Java code.)

  • The JDK allows developers to create Java programs that can be executed and run by the JVM and JRE.

    package of tools for developing Java-based software

    자바의 컴파일러와 class libraries를 포함한다.

출처 https://www.infoworld.com/article/3296360/what-is-the-jdk-introduction-to-the-java-development-kit.html

참고자료

What is the JRE? Introduction to the Java Runtime Environment

What is the JDK? Introduction to the Java Development Kit

JVM | What is Java Virtual Machine & its Architecture

java / javac 명령어 공식문서

profile
The Process

0개의 댓글