https://www.youtube.com/watch?v=UzaGOXKVhwU 

목차

  • 1. JVM이란?
  • 2. JVM 내부구조
  • 3. ByteCode 실행예제

 

1. JVM이란?

  • 근본부터 문제가 있었다. C/C++는 컴파일 플랫폼과 타겟 플랫폼이 다를 경우, 프로그램이 동작하지 않는다.
  • 개발할떄는 문제가없다. 리눅스에서 컴파일한뒤 리눅스에서 돌린다면 문제가없다.
  • 리눅스에서 컴파일해서 나온 실행파일을 윈도우에서 돌리면 문제가된다.
  • 이것을 해결하기 위해 타겟 플랫폼에 맞춰 컴파일하는것을 '크로스 컴파일' 이라고 한다. 이렇게하면 윈도우에서도 동작가능하다.
  • JVM으로 문제를 해결할 수도 있다.
    • Java Source Code가 JavaC라는 Compiler를 거치고 나면 Java Byte코드가 된다. 이 Java Byte 코드는 JVM이 설치된 환경이라면 어디서든 동작이 가능하다.
    • 윈도우라면, 윈도우 JVM을 생성하고 프로그램을 실행시키며 가능하다.
  • 개발자가 짠 자바코드를 컴파일해서 배포하면, 어떤 플랫폼이든 실행시킬 수 있다. ( 그 대신에 플랫폼에는 JVM이 설치되어있어야한다. )
  • 자바는 네트워크에 연결된 모든 디바이스에서 작동하는것이 목적이다.
  • 디바이스마다 운영체제나 하드웨어가 다르기에 자연스럽게 플랫폼에 의존하지 않도록 언어를 설계했다. 그 결과가 Java Bytecode, JVM이다.
  • 자바의 궁극적인 목적은, 
    • Class파일만 네트워크를 통해 전달해주면 Java Virtual Machine이 동작하여 단순히 실행시키면 된다.
    • 이러한 구조는 현재 JavaScript가 이렇게 작동하고 있다. (브라우저에서 Interpret)
  • 컴파일러의 경우 frontend와 backend로 나뉜다고 할 수 있다. 
    • frontend가 코드를 분석하고, backend가 어셈블리로 코드를 변환하며 OS마다 바뀌기에 백엔드는 바뀐다.
    • frontend는 javac, backend는 JVM이 작동한다.

 

2. JVM 내부구조

  • runtime data areas: JVM이 Java Bytecode를 실행하기 위해 사용하는 메모리 공간이다.
    • method area, heap은 모든 스레드가 공유한다.
      • method area : 클래스 로더가 클래스 파일을 읽어오면, 클래스 정보를 파싱해서 Method Area에 저장한다.
      • heap : 프로그램을 실행하면서 생성한 모든 객체를 Heap 에 저장한다.
    • Java Stack, pc registers, native method stacks은 각 쓰레드마다 존재한다.
      • PC registers (Program Counter registers) : 각 스레드는 어떤 메서드를 항상 실행하고있다. PC(Program COunter)는 현재 그 메서드안에어 byte코드 몇번쨰 줄을 실행해야하는지 알려주는 역할이다.
      • Java Stacks : 자바 스택은 스레드별로 1개만 존재하고, 스택 프레임은 메서드가 호출될때마다 생성된다. 메서드 실행이 끝나면 스택 프레임은 pop되어 스택에서 제거된다. 맨 위의 StackFrame은 Main Method이다. 그 아래의 Stack은 Main Method에서 실행한 함수이다. 이렇게 일종의 재귀구조가 떠오른다.
        • Stack Frame 
          • 스택 프레임은 메서드가 호출될때마다 새로 생겨 스택에 push 된다.
          • 스택 프레임은 Local variables array, Operand stack, Frame Data 를 가진다. 
          • Frame Data는 Constant Pool, 이전 스택 프레임에 대한 정보, 현재 메서드가 속한 클래스/객체에 대한 참조등의 정보를 갖는다. 내 메서드가 어떤 클래스에 속하는지.. 등과 같이 byte메서드가 실행되기 위해서 당연히 필요한 정보다.
      • native method stacks : Native Method는 Java Bytecode가 아닌 다른 언어로 작성된 메서드를 의미한다. 성능향상을 목적으로 사용하는 method다.

3. ByteCode 실행예제

  • public class Main{
        public static void main(String[] args){
            double position = 1.0;
            double initial = 1.0;
            double rate = 1.0;
            position = initial * rate * 60;
        }
    }
  • 이것을 byte 코드로 바뀔경우
    • 실행할 명령어의 목록이 나온다. 즉, Program Counter가 이 ByteCode중에서 몇번째로 실행할것인지 저장되어있다.
    • local Variable Array 를 살펴보면 args, position, inital rate를 볼 수 있다.
    • Operand Stack 
    • Program Counter : 내가 이제 사용할 byte코드가 몇번쨰 줄인지
  • 피연산자를 저장하는데 JVM이 왜 register가 아닌 STACK을 사용할까? ( 어셈블리어 및 C는 register를 사용하여 연산한다.)
    • Java가 다기종의 device에서 균일하게 보장하고싶다. Device마다 register의 수가 다르기에 STACK을 사용한다. 만약 다른 device에서 reigster 수가 적을 수 있기에 그렇다.

 

 

 

+ Recent posts