Java Thread

  • 하나의 프로세스 안에 여러 개의 스레드가 동시에 작업 수행
  • 스레드 == 하나의 작업단위
  • 자바에서 스레드 구현은 2가지 방법이 있다 : Runnable 인터페이스, Thread 클래스 상속
    • 공통점 : 둘 다 run() 메소드를 오버라이딩하는 방식
    • 차이점 : 인스턴스 생성 방법
      • public class MyThread implements Runnable
        • 해당 클래스를 인스턴스화해서 Thead 생성자에 argument로 넘겨줘야함
        • currentThread() 호출해서 현재 스레드의 참조를 얻어와야 호출 가능
      • public class MyThread extends Thread
        • 상속받은 클래스를 스레드로 사용
        • 스레드 클래스의 method을 바로 사용
  • start() 메소드를 호출하면, JVM은 알아서 스레드를 위한 콜 스택을 만들어주고 context switching을 통해 스레드로 동작하도록 해줌
  • 스레드 상태
    • NEW : 스레드가 생성되고, start()가 호출 X
    • RUNNABLE : 실행 중 or 실행 가능 상태
    • BLOCKED : 동기화 블록에 의해 일시 정지된 상태 (lock 풀릴 때까지 wait)
    • WAITING : 실행가능하지 않은 일시 정지 상태
    • TERMINATED: 스레드 작업이 종료된 상태
  • synchronized를 활용하여 임계 영역(공유 자원에 하나의 스레드만 접근) 설정 가능
  • wait() : 스레드가 lock을 가지고 있으면, lock 권한 반납하고 대기하게 만듦
  • notify() : 대기 상태인 스레드에게 다시 lock 권한을 부여하고 수행하게 만듦

'Language > Java' 카테고리의 다른 글

JVM이란  (0) 2020.11.15

자바 가상 머신(JVM)

  • 자바 애플리케이션(ByteCode)을 클래스 로더를 통해 읽어들여 자바 API와 함께 실행

  • JAVA와 OS 사이에서 중개자 역할 – 따라서 JAVA가 OS에 구애받지 않게 재사용

  • 가장 중요한 메모리 관리(Garbage collection)을 수행

  • 스택 기반의 가상 머신

JVM 구성 = Class loader + Execution engine + GC + Runtime Data Area

  • 클래스 로더 : 클래스(.class)를 로드하고, 링크를 통해 배치

  • 실행 엔진 : 클래스를 실행 / ByteCode -> 기계어로 변환하는2가지 방식

    • 인터프리터 : 명령어 단위로 읽음. 한 줄씩 실행해서 느림

    • JIT (just in time)

      • 인터프리터 방식으로 실행하다가 byte code 전체 컴파일

      • 네이티브 코드로 실행하고 네이티브 코드로 직접 실행

      • 네이티브 코드는 캐시에 보관하므로 컴파일 후 빠르게 수행됨

    • GC : 힙 내의 객체 중 참조되고 있지 않은 객체를 찾아내 메모리 회수 (실제로는 실행 엔진 내부에 존재한다고 봐도 된다)

      • Minor GC
        • 새로 생성된 객체는 Eden 영역에 위치
        • Eden 영역에서 GC가 발생하고 남은 객체는 Survivor 영역(2개) 이동
        • 위 과정 반복하다 계속 살아남은 객체는 계속 참조 – Old 영역 이동
      • Major GC
        • Old 영역의 객체 모두 검사 -> 참조되지 않은 객체 한꺼번에 삭제
        • Major GC가 발생하면 GC 실행 스레드 제외 나머지 스레드 모두 중지
        • GC 작업 이후에 중단 작업 다시 시작
        • Full GC가 일어나는 수초간 모든 Thread가 정지한다면 심각한 장애 발생
  • Runtime Data Area = Method, Heap, Stack, PC register, native method stack

    • 쓰레드가 생성되었을 때 기준으로 메소드, 힙 영역은 모든 쓰레드가 공유 / 스택, PC register, native method stack은 각 쓰레드마다 생성되고 공유 X
    • Method Area : 메소드 영역 (ex> 변수 이름 등 필드 정보, 메소드 정보,static 변수)
    • Heap Area : new 키워드로 생성된 객체와 배열이 생성되는 영역. 메소드 영역에 로드된 클래스만 생성, GC가 참조되지 않는 메모리를 확인하고 제거하는 영역
    • Stack Area : 지역변수, 파라미터, 리턴 값, 임시값 등이 생성되는 영역, 인스턴스 생성시 스택 영역에 생성된 변수 값이 힙 영역에 생성된 객체를 가리키는 것 (메소드 스택)
    • PC register : Thread가 생성될 때마다 생성되는 영역, program counter, 즉, 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장
    • Native method stack : 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역(ex> C)

'Language > Java' 카테고리의 다른 글

Java Thread  (0) 2020.11.23

+ Recent posts