슈퍼코딩/주특기(JAVA)

2024.05.06(월) 슈퍼코딩 신입연수원 6주차 Day 1 후기 - JVM

곰돌이볼 2024. 5. 6. 19:13
  • 강의
    • 39강(Big Picture) ~ 40강(JVM 원리)

실무 백엔드 에러


  • 비즈니스 로직 에러
    • 코드는 정상적으로 돌아가지만 원하는 로직이 동작하지 않음
  • 시스템 버그
    • 데이터베이스 에러
    • 네트워크 에러
    • JVM 에러 → JVM 모니터링을 통해서 예방

Java 기초


  • 실습 : Java RAM 메모리 할당
    • IntelliJ → Modify Run Configuration … → Modify Options → Add VM options → -Xmx1M 입력
    • -Xmx1M : 최대 RAM의 heap 메모리값을 1mbyte 할당
  • 컴파일 : .java 파일을 .class 파일로 변경하는 빌드 과정
    • 컴파일 에러
      • Syntax Error
      • Type Check Error
  • 런타임 : 실행 과정
    • 런타임 에러
      • 메모리 부족 에러
      • null reference error
  • IntelliJ tool
    • IntelliJ profiler : Java 애플리케이션 문제 진단 및 성능 측정 도구
      • Events를 주로 확인함 → JVM(Java Virtual Machine)의 GC
    • IntelliJ Debugger : Java 애플리케이션 버그, 에러를 찾고 수정하는 툴
      • break point : 멈추는 포인트
      • 코드 진행
        • Step Over : 다음 라인 진행
        • Step Into : 라인의 자세한 메서드 진행
        • Step Out : 자세히 들어간 메서드에서 원래 곳으로 돌아감
        • Force Into : 자바에서 제공하는 기본 클래스의 Step Into를 강제로 하는 것
        • Resume Program : 다음 브레이크 포인트로 이동
      • 진행값 확인

JVM


자바 컴파일 및 실행 과정

 

 

JVM 구조

  • Native Method Library : Java가 아닌 언어로 작성된 네이티브 메서드 구현을 포함한 라이브러리
  • Native Method Interface(NMI) : JVM에서 네이트브 메서드를 사용할 수 있도록 하는 인터페이스
    Java 실행 과정

 

JVM의 Class Loader(클래스 로더)

  • 컴파일된 여러 .class 파일을 loading, linking, initialization을 한 후 필요한 데이터를 Runtime Data Area에 저장
  • Lading(로드) : 클래스 파일을 가져와 JVM의 메모리로 로드
  • Linking(링크) : 클래스 파일 사용을 위한 검증 과정
    • Verifying(검즘) : 클래스가 JVM 명세대로 구성되어 있는지 검사
    • PreParing(준비) : 클래스가 필요로 하는 메모리 할당
    • Resolving(분석) : 클래스 상수들의 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스(주소값)로 변경
  • Initialization(초기화) : 변수들을 적절한 값으로 초기화

 

JVM의 execution engine(실행 엔진)

  • Java Interpreter : byte 코드를 한 줄씩 읽고 실행하는 과정으로, class 파일을 OS가 기계어로 읽는 과정
  • JIT complier(Just-In-Time Complier) : 자주 사용하는 코드를 컴파일
  • GC(Garbage Collector) : 자주 사용하지 않는 객체를 해제해서 메모리 관리(메모리 최적화)

 

JVM의 Runtime Data Area

  • JVM이 실행되는 동안 데이터를 저장하는 메모리 공간 
    JVM의 Runtime Data Area
  • JVM stack
    • 임시로 할당되고 소멸되는 정보 저장
    • 프레임 단위로 저장됨
    • 프레임 : 해당 메소드(매개 변수, 지역변수 등)를 저장하는 공간으로, 메서드 종료 시 삭제됨
  • Native Method Stack : 네이티브 메서드가 호출될 때 사용되는 스택
  • Heap
    • 동적 영역
    • 인스턴스와 배열 타입 등 저장
  • Method Area
    • "클래스(속성, 메소드, 상속 정보 등), 메소드(매개변수, 이름, 접근제어자 등), 정적 필드, 상수 풀"을 저장하는 영역
    • 상수 풀 : static이 붙은 정적 변수, 리터럴 등의 저장 영역 → 컴파일 시 저장됨
    • 클래스, 메소드 등에 대한 정보는 Class Loader 동작 시 저장됨
      • 아래 class 내 static 구문은 class loader 동작 시 실행되고 저장됨
class Student {
	static {
    	System.out.println("I'm student.");
    }
}

 

  • 실습 - JVM 동작 확인
    • IntelliJ → Modify Run Configuration … → Modify Options → Add VM options → 명령어 입력
    • 명령어
      • -Xlog:class+init : 클래스 로더 동작 확인
      • -XX:+PrintCompilation : 실행 엔진 동작 확인
    • 터미널
      • 컴파일 후 out/production/{프로젝트명} 폴더로 이동 명령어 입력
      • 명령어 : javap -v 클래스_파일명
      • Constant pool(상수 풀) 생성 내용 확인