더 자바 JVM
728x90

인프런의 백기선님의 강의 정리용입니다.

JAVA...

JAVA 란?

  • 프로그래밍 언어
  • JDK에 들어있는 자바 컴파일러를 사용하여 바이트코드로 컴파일 할 수 있다.

JVM(Java Virtual Machine)

  • 자바 가상머신으로 .class(바이트 코드) 를 OS에 맞는 코드로 변환

JVM 구조

JVM 구조 중에 중요한 것은 힙영역과 메서드 영역이다

힙, 메서드는 공유 자원 , 나머지는 쓰레드 개념이다.
클래스 로더 시스템

  1. 로딩 : 클래스를 로딩... 로딩 완료시 링크를 함.
  2. 링크
    1) Verify: .class 파일 형식이 유요한지 검증
    2) Prepare: 클래스 변수(static 변수) 와 기본값에 필요한 메모리
    3) Resolve : 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체한다.
    • 심볼릭 레퍼런스 : 실제 new 로 해서 생성한 객체는 클래스 로딩 전에 실제 힙영역에 있는 객체를 참조하지 않는다. 논리적(?)으로 참조하고 있는 것이다. 하지만 Resolve 단계에서 이 논리적인 참조를 힙 영역과 연결하는 역할을 한다.
  3. 초기화 : static 변수의 값을 할당한다. 클래스의 static 키워드가 붙은 것들은 이때 할당이 된다.

JVM 메모리

  1. 힙 : 객체 저장, 인스턴스들을 명시적으로 만드는 객체들도 힙에 저장됨. (ex) ( Person person = new Person(); )
  2. 메서드 영역 : 클래스 수준의 정보, 전역적으로 사용되는 공유자원 느낌.
    • 풀패키지 경로 ( package me.mypackage; 클래스 맨위에 있는..)
    • 클래스 이름
    • 상속받은 클래스가 있다면 부모클래스의 이름
      public class App{ 
        public static void main( String[] args ) {
          ClassLoader classLoader = App.class.getClassLoader(); 
          System.out.println(classLoader); 
          System.out.println(classLoader.getParent()); } }
          —————————————————————————————————————————— 
          jdk.internal.loader.ClassLoaders$AppClassLoader@71bc1ae4
          jdk.internal.loader.ClassLoaders$PlatformClassLoader@48140564
          ——————————————————————————————————————————
    • 스태틱 변수 ( static int number = 10;)
    • 메서드 들
  3. 스택 : 쓰레드마다 런 타임 스택 생성. 그 안에다가 스택 프레임을 쌓는다.(메소드 콜, 어떤 메소드를 호출 했는지), Exception 또는 Error 시 나오는 콘솔창에 나오는 (at 호출 한 메소드 명 (클래스명.java : 17)) 쓰레드마다 한개 씩 생성됨.
  4. PC(Program Counter) 레지스터 : 쓰레드 마다 생성
  5. 네이티브 메소드 스택 : 네이티브 메소드를 호출 할 때 메소드에 native라는 키워드가 있고 그 메소드의 구현을 C 또는 C++로 한 것.
    실제로 Thread.currentThread();를 까서 들어가보면 native 키워드가 붙어 있는게 있다.
  6. 네이티브 메소드 라이브러리 : 네이티브 메소드 인터페이스 (JNI)를 통해야 한다. 네이티브 메서드를 사용할 때 네이티브 메소드 스택이 생성되고 네이티브 메서드 인터페이스를 사용하는 프레임이 쌓인다.

실행 엔진

  1. 인터프리터 : 바이트 코드를 이해하는 것. 기계언어로 한줄 씩 바꿔준다. 한줄마다 네이티브 코드로 컴파일 한다. 똑같은 코드가 나올때는 JIT 컴파일러로 보낸다.
  2. JIT 컴파일러 : 저스트 인 타임 컴파일러. 자바 파일을 컴파일 하는 것이 아니라 바이트코드를 네이티브 코드로 바꾼다. 반복된 코드를 다 찾아서 미리 바꿔 놓는다. 인터프리터가 반복하는 코드에 진입했을 때 한줄 씩 인터프린팅 하는 것이 아니라 변경되어 있는 네이티브 코드를 바로 실행한다.
  3. GC(가비지 컬렉터) : 안쓰는 객체들을 없애는 역할

출처 : 인프런 백기선님 강의 | https://www.inflearn.com/course/the-java-code-manipulation

728x90

'더 자바' 카테고리의 다른 글

더 자바 리플렉션(2)  (0) 2022.04.04
더자바 리플렉션 (1)  (0) 2022.04.01
더 자바 바이트코드 조작  (0) 2022.03.31