IT/Java

[JAVA 스터디][1주차_1] JVM, JDK, JRE, 바이트코드 총 정리

jaewon_sss 2020. 11. 16. 00:32
반응형


1주차(1) - 목차


1. JVM이란 무엇인가

2. 바이트코드란 무엇인가

3. JVM 구성 요소

4. JDK와 JRE의 차이




1. JVM 이란 무엇인가

  • Java Virtual Machine(자바 가상 머신) 의 약자로 자바 코드를 컴파일해서 얻은 바이트 코드를 실행하는 주체
  • 자바 어플리케이션을 클래스 로더를 통해 읽어들여 자바 API와 함께 실행하는 것이다.
  • 자바와 OS사이에서 중개자 역할 -> JVM이 설치된 곳이라면 어느곳에서든지 자바파일을 실행할 수 있다.
  • Write Once Run Anywhere! = 플랫폼 독립적





2. 바이트코드란 무엇인가

    •  .java 파일을 JVM에서 컴파일하여 .class 파일로 만든 파일을 의미한다.



    3. JVM 의 구성요소




      •  Java Compiler인 javac 를 통해 생성된 자바 바이트 코드(.class)는 Class Loader에 의해서 JVM내로 로드됩니다.

      • 메모리에 로드된 클래스(Java Byte Code)들을 Excecution Engine를 통해 기계어로 변경하여 메모리 상(Runtime Data Area)에 배치합니다.

      • Garbage Collector(GC)는 Heap 메모리 영역에 생성(적재)된 객체들 중에 참조되지 않는 객체들을 탐색 후 제거하는 역할을 합니다.



      Runtime Data Areas 구조



      1. Method area (메소드 영역)

      클래스 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보같은 필드 정보와 메소드의 이름, 리턴 타입, 파라미터, 접근 제어자 정보같은 메소드 정보, Type정보(Interface인지 class인지), Constant Pool(상수 풀 : 문자 상수, 타입, 필드, 객체 참조가 저장됨), static 변수, final class 변수등이 생성되는 영역이다.


      2. Heap area (힙 영역)

      new 키워드로 생성된 객체와 배열이 생성되는 영역이다.

      메소드 영역에 로드된 클래스만 생성이 가능하고 Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역이다.


      3. Stack area (스택 영역)

      지역 변수, 파라미터(매개변수), 리턴 값, 연산에 사용되는 임시 값등이 생성되는 영역이다.

      int a = 10; 이라는 소스를 작성했다면 정수값이 할당될 수 있는 메모리공간을 a라고 잡아두고 그 메모리 영역에 값이 10이 들어간다. 즉, 스택에 메모리에 이름이 a라고 붙여주고 값이 10인 메모리 공간을 만든다.

      클래스 Person p = new Person(); 이라는 소스를 작성했다면 Person p는 스택 영역에 생성되고 new로 생성된 Person 클래스의 인스턴스는 힙 영역에 생성된다.

      그리고 스택영역에 생성된 p의 값으로 힙 영역의 주소값을 가지고 있다. 즉, 스택 영역에 생성된 p가 힙 영역에 생성된 객체를 가리키고(참조하고) 있는 것이다.

      메소드를 호출할 때마다 개별적으로 스택이 생성되어 저장되었다가 실행이 완료되면 제거됩니다.(임시저장공간)


      4. PC Register (PC 레지스터)

      Thread(쓰레드)가 생성될 때마다 생성되는 영역으로 Program Counter 즉, 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다. (*CPU의 레지스터와 다름)

      이것을 이용해서 쓰레드를 돌아가면서 수행할 수 있게 한다.


      5. Native method stack

      자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역이다.

      보통 C/C++등의 코드를 수행하기 위한 스택이다.





      4. JDK와 JRE의 차이




          JDK(Java Development Kit)은 Java 기반의 애플리케이션을 개발하는데 필요한 도구를 말한다.

          다양한 도구를 비롯해 JRE 포함하므로 더욱 넓은 디스크 공간이 필요하다.

          Java 애플리케이션과 애플릿을 작성하는데 필요한 JRE, API 클래스 집합, Java 컴파일러 Web Start 및 추가 파일을 제공한다.

          JRE(Java Runtime Environment) - Java 애플리케이션을 실행하기 위한 JVM을 구현하는 환경

          JVM, JRE, JDK는 플랫폼에 의존적이지만 덕분에 JDK를 통해 작성된 프로그램은 플랫폼 독립적으로 실행될 수가 있다.


          즉, JRE는 소스코드를 읽기 위해, JDK는 소스코드를 작성하기 위한 것들이 포함되어있다고 생각 하면 된다. 


          1주차(2)에 이어서 포스팅


          반응형