본문 바로가기
Tech/Java

JVM 더 깊이 있게 알아보자

by Dog발자. 2020. 5. 22.
반응형

https://docs.oracle.com/javase/8/docs/index.html

- JDK (Java Development Kit)

JDK 는 단어 그대로 자바 개볼 도구 이다 그래서 개발자들의 개발을 도와주는 도구들을 포함하고 있다 그리고 JRE을 포함호고 있다. 하지만 개발자가 아닌 일반 사용자들은 설치할 필요없는다.

 

- JRE (Java Runtime Environment)

JRE는 JAVA 를 실행 하기위한 환경을제공해준다 보통 개발할때 JDK를 설치하기 때문에 따로 설치하지는 안지만 일반 사용자들은 개임이나 JAVA 환경의 프로그램을 실행하기 위해 설치 해야하는 것이 JRE다.

 

위 표를 보면 각각 무엇을 포함하고 있는지를 확인 할 수 있다.

 

- JVM(Java Virtual Machine)

JAVA(.java) 파일을 컴파일 하여 생성되는 Byte Code(.class) 파일을 를 실행시키는 가상 머신이다 그러기 때문에 JVM 이 올라갈 수 있다면 어떠한 OS 환경이여도 JAVA 파일을 실행 시킬 수 있다는 장점이 있다. 

 

이번 포스팅은 JVM을 좀더 깊이 있게 심층적으로 분석 해 보려고 한다.

 

위에 그림을 보면서 하나씩 설명하려고한다. 일단 각각의 기능을 설명하고 종합 적으로 요약 하겠다.

 

<Java Complie>

.java 파일을 컴파일 하여 JVM 의 Excution Engine이 실행 할 수 있는 Byte Code로 변환한다.( .class)

 

<Class Loader>

http://www.realjavaonline.com/java-virtual-machine/class-loader-page.php

Class loader는 위 그림의 순서대로 코드에서 사용되는 Class 들을 JVM의 메모리영역에(Runtime Data Area) 올린다.

 

:Verifying: 파일의 안전한지를 검사하는 단계로 메모리에 할당 가능한지 검토와 보안 검토를 한다.바이트 코드에 대한 다양한 점검을 수행하여 해당 형식이 올바르게 형성되는지 확인합니다.

 

:Preparing:  class, method, fields 들을 메모리에 등록한다.

 

:Resolving: 기호 참조를 직접 참조로 변환.  (Transforming symbolic references from the type into direct references.)

그냥 간단하게 이또한 메모리에 등록한다고 생각하면 된다. (사실 100% 이해 하지는 못했다.)

 

:Initializing: class 에서 지정한 static 변수(클래스 변수)를 메모리 영역에 할당한다.

(static 이란?)

https://jktech.tistory.com/7

 

main(String[] args) 메소드 깊이 있게 알아보자 (2) - static

- Java Static 이란? 영어 단어로서의 static은 다음과 같은 의미를 가진다 정지상태의, 고정된, 변화가없는 이러하듯 static으로 선언된 자원 들은 JVM의 메모리 영역에 딱 한번만 올라가게 된다. 이러��

jktech.tistory.com

변수의 종류 선언위치 생성시기(메모리 할당 시기)
클래스 변수 클래스 영역 클래스가 메모리에 올라갈 때
인스턴스 변수 인스턴스가 생성될 때
지역 변수 클래스 이외에 영역(메서드, 생성자, 초기화 블록) 변수 선언문이 수행 되었을 때

 

<Runtime Data Area>

Method Area: 모든 Thread 들이 공유하는 메모리 영역이다. Class(Type), Method, Field 정보를 가진다.

  • 상수풀: 해당 Type의 메소드, 필드, 문자열 상수등의 레퍼런스를 가지고 있습니다.
  • 실제 물리적 메모리 위치를 참조할 때 사용합니다.
  • Class Aream Code Area, Static Area 라고도 불린다. (static변수 와 Class 정보가 같은 위치에 있기때문에 Static Area라고도 불린다. 그렇게 때문에 static Method Area 올라간다.)

Heap: 객체들이 할당 되는 영역이다. Method Area 에서 참조 되어있는 객체를 생성하면 이곳에 할당된다.

 

Java Threads(Java Stack): 각각의 Thread가 시작될때 생성되는 역역이고 Stack 형식(Stack Frame)을 저장하는 영역이다. method가 시작 할때 마다 하나의 stack fram이 생성되고 해당 Thread의 Java Statck 에 할당 된다. 그리고 method가 종료되면 stack fram에서 제거된다.

https://smjeon.dev/etc/jvm-rda/

class Person { 
	int pid;
    String name; // constructor, setters/getters 
}
public class Driver { 
	public static void main(String[] args) {
    	int id = 23;
        String pName = "Jon";
        Person p = null;
        p = new Person(id, pName);
	}
}

https://blog.jiktong.kr/2235

 

PC(Program Counter) Counter Registers: 다음 번에 실행할 명령어 주소를 기억하는 레지스터 라고만 이해하는게 좋을것 같다 많약 좀더 알고 싶다면 아랴 D2링크롤 통해 확인하면 좋을 것 같다.

 

Native Method Stacks: JAVA 외의 언어로 작성된 네이티브 코드를 위한 스택이다. 즉, JNI(Java Native Interface)를 통해 호출하는 C/C++ 등의 코드를 수행하기 위한 스택으로, 언어에 맞게 C 스택이나 C++ 스택이 생성된다.

 

<Execution Engine(실행 엔진)>

클래스 로더를 통해 JVM 내의 런타임 데이터 영역에 배치된 바이트코드는 실행 엔진에 의해 실행된다. 실행 엔진은 자바 바이트코드를 명령어 단위로 읽어서 실행한다.

 

더 깊이있는 내용을 원한다면 아래 링크에서 확인하기를 추천한다 좀더 쉽게 설명하여 내용을 전달 하고싶었지만 아래 글보다 좋게 작성하기가.. 아 .. 역시 Naver

 

<JVM Naver 자료>

https://d2.naver.com/helloworld/1230

 

반응형

댓글