[java]JVM JRE JDK

자바 소스파일이 JVM으로 실행하는 과정

  1. Hello.java를 생성한다.
  2. Java Compiler를 통해 Hello.class파일이 생성된다. Byte Code는 플랫폼 독립적이다. OS관계 없이 동일하다. (javac 명령어)
  3. JVM의 Java Interpreter는 Byte Code를 한줄씩 기계어로 변환하며 그때그때 실행한다. (java 명령어)

 

 

ClassPath

  • JVM이 프로그램을 실행할 때 Class 파일을 찾는데 기준이 되는 경로
    • InteliJ에서는 Project Structure의 Resource에서 설정가능

 

 

JIT컴파일러 란

우리가 작성한 자바 코드는 컴파일러를 통해 바이트 코드로 컴파일이 되고, 이 바이트코드는 인터프리터를 통해 한 줄 씩 기계어로 번역되어 실행이 된다고 위에서 설명하였다. 이 과정이 있기에 자바는 속도가 느리다는 말이 나오게 되었다.

 

JIT 방식은 실행 시점에 자주 쓸만한 코드들을 기계어로 변환해 놓고 캐싱해 두었다가 재사용할 때 이미 변환된 기계어 코드를 사용한다. 이 과정에서 초반에 메모리를 잡아두거나 하는 선행 작업들이 있어서 초기 실행 속도는 다소 느릴 수 있다.

 

하지만 그 이후로는 바이트 코드를 사용할 때마다 기계어로 전환하는 작업이 줄어 들어 실행 속도가 향상된다.

 

JVM Runtime Data Area

  • JVM이 운영되면서 운영체제로 부터 부여 받은 메모리 영역

메소드 영역

  • 모든 쓰레드가 공유하는 영역
  • JVM이 시작될 때 생성된다.
  • 클래스와 인터페이스의 메소드에 대한 바이트코드, 전역변수 (클래스 변수), 런타임 상수 풀이 위치

힙 영역

  • 객체를 저장할 때 사용하는 메모리영역

 

스택 영역

  • 쓰레드 마다 하나씩 존재한다.
  • JVM은 오직 JVM 스택에 메소드에 대한 스택 프레임을 추가하고 제거하는 동작만 실행
  • 실행 되는 메소드의 스택 프레임을 가진다.
    • 각 스택 프레임에는 지역변수, 메소드의 인자, 메소드의 리턴값, 리턴 번지등이 저장
    • 스택 프레임은 메소드가 끝나면 사라진다.

 

PC 레지스터

  • 쓰레드가 시작될 때 생성되며 쓰레드 마다 하나씩 존재하여 실행 할 JVM의 명령어의 주소를 가리킨다.
  • 다음 실행 될 메소드 영역에 올라와 있는 바이트코드의 주소를 가르킨다.

 

실행 상수 풀

  • 메소드 영역으로 부터 할당 받으며 클래스와 인터페이스의 상수, 메서드, 필드에 대한 모든 레퍼런스를 저장하는 영역
  • 자바 프로그램에서 어떤 메서드나 필드를 참조 할 때 JVM은 런타임 상수 풀을 통해 해당 메서드나 필드의 실제 메모리상 주소를 찾아서 참조 하게 된다.

네이티브 메소드 스택

  • 자바 이외의 언어로 작성된 네이티브 코드를 위한 스택

 

 

  • 메소드 별 Stack Frame에는 메소드 안에 정의된 로컬변수, 매개변수, 리턴 값 등이 저장된다.
  • 메소드 내 로컬변수의 배열, 피연산자 스택, 상수 풀에 대한 참조 등이 저장되고 메소드가 종료되면 제거된다. 지역변수 배열, 피연선자 스택의 크기는 컴파일 시 결정되기 때문에 스택 프레임의 크기도 메소드에 따라 크기가 달라진다.

 

 

Class Person {
	String name;
}

Class Main {
	public static void main (String[] args) {
    	Person person1 = new Person();
        person.name = "suri";
        
        Person person2 = new Person();
        person.name = "dwl";
    }
}

 

 

  • 메소드 내에서 객체 참조 형으로 선언된 변수인 경우 지역변수로서 스택에 위치하며 힙에 저장되어 있는 객체애 대한 참조값을 가지게 된다.
  • 객체 참조 형 변수의 값이 null 이라는 의미는 아무것도 참조하고 있지 않다는 의미이다.
  • new 연산자는 힙 메모리에 객체를 만들고 그 객체의 참조값을 반환한다.
  • 객체 참조 변수의 경우 대입, 메소드 호출시의 인자, 반환형 등으로 사용 될 때 참조 값만 전달 될 뿐, 객체 자체가 복제되어 전달되는 것은 아니다.

 

 

 

JDK와 JRE

 

 

  • JRE (Java Runtime Environment)
    • 자바 프로그램을 실행하기 위한 최소한의 환경
    • 바이트 코드를 JVM으로 로드하는 역할을 수행한다.
  • JDK
    • JRE와 자바 프로그램 개발을 위해 필요한 모든 툴들을 모아놓은 소프트웨어 패키지
    • javac
      • 자바 컴파일러 자바 소스 파일을 바이트 코드로 컴파일
    • java
      • 자바 응용 프로그램 로더 javac로 컴파일한 바이트 코드를 해석 및 실행
    • javap
      • 디스어셈블러 바이트코드를 자바 소스 코드로 변환
    • javadoc
      • 자동 문서 생성기. 소스 코드의 주석으로 부터 자동을 문서를 생성
    • jar
      • 압축 툴. 관련있는 클래스 라이브러리들과 리소스들을 하나의 JAR로 묶어줌

'study' 카테고리의 다른 글

[Spring] Scheduling - CronTask  (0) 2021.10.02
[AWS] AWS에는 무슨 서비스가 있을까?  (0) 2021.07.20
내가 만난 CORS 관련 문제  (2) 2021.06.14
[java] 클래스와 인스턴스  (0) 2021.06.10
[JAVA] Optional  (0) 2021.05.15

댓글



Designed by JB FACTORY