Spring Basic (JAVA) #1

Danny·2023년 10월 23일
0

백엔드

목록 보기
5/10

Spring 은 객체지향 언어 Java 기반의 프레임워크

JAVA : Java 원리 / 구조 + Java 잘 잘성하는 방법
SPRING : Spring 프레임워크 원리 / 구조

Checked Exception, Unchecked Exception

체크 예외와 언체크 예외(Checked, Unchecked Exception)

자바의 예외는 크게 3가지로 나눈다.

  • 체크 예외(Checked Exception)
  • 에러(Error)
  • 언체크 예외(Unchecked Exception)

에러

  • 개발자가 알수 없는 실수,복구 불가능
    • 메모리 부족(OutofMemoryError)
    • 스택오버플로우(StackOverflowError)

예외

  • 개발자의 실수,보이는 오류라 복구 가능
    • 배열의 범위를 벗어난(ArrayIndexOutOfBoundsException)
    • 값이 null이 참조변수를 참조(NullPointerException)
    • 존재하지 않는 파일의 이름을 입력(FileNotFoundException)


체크 예외(Checked Exception)
체크 예외는 RuntimeException의 하위 클래스가 아니면서 Exception 클래스의 하위 클래스들입니다. 체크 예외의 특징은 반드시 에러 처리를 해야하는 특징(try/catch or throw)을 가지고 있습니다.

  • 존재하지 않는 파일의 이름을 입력(FileNotFoundException)
  • 실수로 클래스의 이름을 잘못 적음(ClassNotFoundException)

체크 예외의 예시는 이러한 것들이 있습니다.

언체크 예외(Unchecked Exception)
언체크 예외는 RuntimeException의 하위 클래스들을 의미합니다. 이것은 체크 예외와는 달리 에러 처리를 강제하지 않습니다.
말 그대로 실행 중에(runtime) 발생할 수 있는 예외를 의미합니다.

  • 배열의 범위를 벗어난(ArrayIndexOutOfBoundsException)
  • 값이 null이 참조변수를 참조(NullPointerException)

언체크 예외는 이러한 것들이 있습니다. 그냥 보아도 실행 중에 발생할 만한 이름들입니다. 그러면 언체크 예외는 예외처리를 강제하지 않는 이유는 무엇일까요?

만약 언체크 예외가 에러 처리를 강제해야 했다면 아래와 같은 상황이 발생할 것입니다.

public class ArrayTest {
   public static void main(String[] args) {
       try {
           int[] list = {1, 2, 3, 4, 5};
           System.out.println(list[0]);
       } catch (ArrayIndexOutOfBoundsException e) {
           e.printStackTrace();
       }
   }
}

1. Class Loader : 적재자

  • 컴파일 완료된 Bytecodes (.class) 는 Class Loader 로 전달된다.
    : Bytecodes 가 JVM 로 전달되면 가장 먼저 Class Loader 가 받는다
  • 동적 로딩(Dynamic Loading)으로 필요한 클래스만 런타임 데이터 영역 적재

2. Runtime Data Area : 적재된 곳

  • JVM 메모리 : Class Loader 가 필요에 따른 클래스들을 적재하는곳
    공유 영역
    Heap : Garbage Collection 의 대상이므로 조금있다 자세히
    - 객체, 메모리 영역
  • Method : 전역변수, Static 변수 등 (프로그램 끝날때까지 생존)
  • Thread 영역
    • Stack : 지역변수, 파라미터, 리턴값
    • PC Register : 스레드 고유 주소 및 명령 저장
    • Native Method Stack

3. Execution Engine : 적재된걸 실행

  • JVM 엔진 : Runtime Data Area 에 적재된 Bytecode 실행기
    • 인터프리터 : Bytecode 는 코드를 즉시 읽어들여 동작하는 방식
    • JIT 컴파일러 : 실행이 잦은 Bytecode → 기계어로 미리 컴파일해놓는것
    • Garbage Collection : 적재된걸 정리
      • 유효하지 않는 메모리를 JVM의 가비지 컬렉터가 알아서 정리해준다.

4. JVM,JRE,JVM 포함관계

JDK

자바 개발 환경(Java Development Kit)

컴파일러(javac), 역어셈블러(javap), 디버거(jdb), 의존관계 분석(jdeps) 등 개발에 필요한 도구를 제공한다.

JRE

자바 실행 환경(Java Runtime Enviornment)

자바 실행 명령, 프로그램 실행 실패 등이 발생할 경우 대화 상자를 표시하는 시작 프로그램 파일(javaw.exe),

클래스로더와 바이트코드의 실행(java.exe)에 필요한 기본 라이브러리(rt.jar)를 제공한다.

💡 rt는 RunTime를 의미한다. rt.jar는 자바 런타임 환경에서의 코어 자바 클래스 컬렉션이다.

JVM에서 rt.jar파일에 담긴 클래스 파일들을 런타임시에 메모리에 올린다.

아무렇지 않게 사용했던 String 클래스, System 클래스 같은 클래스가 rt.jar 안에 속해 있다.

💡 단, rt.jar는 Java 9부터 삭제됐는데
그 이유는 선택적인 사용과 메모리 로딩이 안되는 기존 모노리틱(Monolithic) 방식을 개선하여
모듈 지정 및 모듈별 버전 관리 기능이 추가됐고

필요한 모듈만 구동해서 크기와 성능 최적화가 가능해졌기 때문이다.

JVM

자바 가상 머신(Java Virtual Machine)

바이트코드 인터프리터, JIT 컴파일러, 링커, 명령어 세트, 가비지 컬렉터, 런타임 데이터 영역(메모리) 등

OS에 독립적으로 실행될 수 있는 추상층을 제공한다.

HEAP

Young/New Generation | -Xmn 옵션 ⇒ Minor GC 대상

  • Eden
  • Survivor 1 (S1)
  • Survivor 2 (S2)

Old/Tenured Generation | -Xms, -Xmx 옵션 ⇒ Major GC 대상

  • Old => 가장 많이 쓰인다고 판단해서 적재한다?

Permanent Generation | -XX:PermSize, -XX:MaxPermSize 옵션

  • Permanent : Class, Method 등의 코드가 저장되는 영역

0개의 댓글