Java

leehyunjon·2022년 7월 30일
0

Java

Java란

Java란 객체지향언어의 대표적인 프로그램 언어.

특징

  • 객체지향 언어
    • 하나의 기능을 객체로 만들고, 그런 객체들을 상호작용하여 프로그램을 만드는 것.
  • 컴파일 언어 & 인터프리터 언어
    • 컴파일 : 코드 전체를 컴파일러를 이용해 컴퓨터가 읽을 수 있는 언어로 번역하는 것.
    • 인터프리터 : 코드 한줄씩 번역하여 명령을 수행하는 것.
    • 자바는 자바 코드를 자바컴파일러(.javac)로 바이트코드(.class)로 번역한다.(컴파일 언어)
      그 후 바이트코드를 인터프리터를 통해 기계어로 번역하여 명령을 수행한다.(인터프리터 언어)

장단점

장점

  • 객체지향 언어로 써 객체지향의 특징인 상속, 다형성, 캡슐화, 추상 등의 특징을 사용할 수 있다.

  • 멀티 스레드 지원

  • JVM을 통해 어떤 운영체제에서도 독립적으로 자바를 사용할 수 있다.

  • JVM에서 자바가 사용하는 메모리를 자동으로 관리 및 최적화 해준다.

단점

  • 컴파일이 느리다.

  • 예외처리를 직접해주지 않으면 컴파일이 되지 않는다.


JDK

JDK란, Java Development Kit의 약자로써 자바가 프로그램을 개발하는데 필요한 도구들을 제공해주는 환경.

JRE

JRE란, Java Runtime Enviroment의 약자로써 자바 코드를 실행시키기 위한 환경(런타임 환경).

자바 코드를 .jar로 압축한 후 자바 컴파일러를 통해 자바 바이트코드로 변환 후 JVM에 의해서 코드가 실행된다.

JVM

JVM란, Java Virtual Machine의 약자로써 자바 코드의 런타임 환경을 제공해주는 주체이다.

JVM은 자바를 어떤 운영체제에서도 실행할 수 있도록 해준다.
(C, C++과 같은 언어는 컴파일된 환경에서만 실행할 수 있다.)


JVM

자바 코드가 실행되는 순서

  1. 프로그램이 실행되면 JVM은 운영체제에서 메모리를 할당 받는다.
  2. 자바 컴파일러(javac)가 자바 코드를 자바 바이트코드(.class)변환한다.
  3. JVM의 클래스 로더에 의해서 바이트코드는 JVM에 로드되고 Runtime Data Area에 배치된다.
  4. JVM의 Execution Engine의 인터프리터에 의해서 바이트코드는 기계어로 해석된다.
  5. 해석된 바이트코드는 실질적 명령을 수행한다.

Class Loader

바이트코드를 JVM에 로드하고 인터프리터에 의해 번역된 바이트코드를 Runtime Data Area에 배치하는 역할을 한다.

Execution

Interpreter

바이트코드를 기계어로 해석한다.

JIT Compiler

인터프리터를 보조하는 역할로써, 인터프리터가 해석할 바이트코드가 이전에 해석한적 있는지 확인하고 없다면 인터프리터가 해석 한 후 저장소에 저장한다. 해석한 적 있다면 저장소에서 해석한 내용을 가져와 사용한다.

Garbage Collection

자바가 사용하는 메모리를 관리 및 최적화 해주는 역할.

Heap영역에 있는 객체 중 사용하지 않는 객체를 삭제하여 메모리를 관리한다.

Runtime Data Area

프로그램을 실행시키기 위해 운영체제에서 할당받은 메모리 공간

Runtime Data Area

Thread

하나의 메소드가 호출될때 생성된다.

PC Register

메서드가 실행될 때 생성되며 자바 코드의 어느 부분을 명령으로 수행해야하는지 저장해 놓는 곳.

즉, JVM명령 주소를 저장해 놓은 곳으로 Thread가 처리하는 Method의 몇번째 코드 줄을 명령으로 수행하는지 저장해 놓는 곳이다.

JVM Stack

프로그램을 수행하면서 Thread가 담당하는 메소드의 정보(매개변수, 지역변수, 리턴값)을 저장해두는 곳.

Heap영역에 생성된 Object타입의 데이터들에 대한 참조를 위한 값들이 할당 및 원시타입 데이터 할당.

메소드 호출이 종료되면 삭제.

Native Method Stack

자바가 아닌 다른언어를 저장하는 곳.

Heap

프로그램이 실행되면서 생성되는 객체 인스턴스를 저장하는 곳으로 JVM의 모든 스레드가 공유하는 메모리 공간이다.

Young Generation과 Old Generation 영역으로 나뉘어지며 Garbage Collection의 대상이되는 곳이다.

Young Generation에는 생명주기가 짧은 젊은 객체가 저장된다.
Old Generation에는 생명주기가 긴 오래된 객체가 저장된다.

Method Area

JVM에 클래스가 로드될 때 생성되며 JVM이 종료될때 까지 유지된다.

Class, Interface, static변수 등을 저장하는 메모리 공간이다.


Garbage Collection

Heap영역에 저장되어있는 객체 인스턴스를 저장하는 역할을 하며 Heap의 Young Generation에서 동작하는 GC를 Minor GC, Old Generation에서 동작하는 GC를 Majar GC라고 한다.

GC 알고리즘

  • Reference Count

    • 어떤 객체에 접근할 수 있는 방법의 개수를 reference count
    • reference count가 0이 되면 GC의 대상이 되어 삭제된다.
    • 두개의 객체가 서로를 참조하게 되면 reference count는 1로 유지되기 때문에 GC의 대상이 되지 않기 때문에 문제 발생.
  • Mark and Sweep

    • 루트에서 부터 어떤 객체에 접근 가능 여부를 판단하여 접근 가능하다면 Mark, 불가능하다면 Reachable 상태가 되어 GC의 대상이된다.
    • GC의 대상이 되어 삭제되는 것을 Sweep

GC 동작 과정

  1. 객체 인스턴스가 새로 생성되었을 경우 Young Generation의 Eden영역에 저장된다.
  2. Eden영역의 메모리가 포화상태가 되면 Stop the Word 후 Mark and Sweep (Minor GC)실행
  3. 살아남은 객체를 Survival 0영역에 저장한다.
  4. Survival 0영역이 포화상태가 되면 다시 Mark and Sweep을 실행
  5. 살아남은 객체를 Survival 1영역에 저장한다.
  6. Young Generation영역에서 GC로부터 살아남는 다면 횟수(age)가 +1씩 카운트 되는데, 일정 age에 도달한다면 해당 객체는 Old Generation 영역에 저장된다.(Promotion)
  7. Old Generation영역이 포화상태가 된다면 Major GC실행.
  • stop the world란 GC를 수행할 때 GC를 수행하는 스레드를 제외한 다른 스레드는 GC를 완료할 때까지 동작을 중지하는 것.

GC 종류

  • Serial GC

    • 하나의 스레드로 GC 실행
    • 다른 GC에 비해 stop the world 시간이 길다.
  • Parallel GC

    • java8의 default GC
    • 여러 스레드로 GC 실행
  • G1 GC

    • java9의 default GC
    • Heap영역을 여러 부분(Young Generation, Old Generation)으로 나누어 GC 수행

GC를 여러 부분으로 나눈 이유
객체 인스턴스의 대부분은 생명주기가 짧기 때문에 GC대상의 탐색 범위를 최소화 시키기 위함이다.

장단점

장점

  • 메모리 누수 방지
  • 해제 메모리 접근 방지 및 해제 방지

단점

  • GC가 언제 발생할 지 모름

GC 주의사항

Major GC는 Minor GC보다 처리시간이 훨씬 오래걸리며 Stop the World와 GC 실행시간을 알지 못하는 것으로 인해 실시간 애플리케이션에서 크리티컬한 이슈가 발생할 수 있다.

그렇기 때문에 GC 모니터링을 통해 문제가 발생할 수 있는 코드를 리팩토링하거나 GC튜닝으로 GC를 효율적으로 사용할 수 있도록 해야한다.

profile
내 꿈은 좋은 개발자

0개의 댓글