2022/11/15 TIL | Java 심화(스레드, JVM)

    반응형

    💭 오늘의 학습 전략

    # 스트림

    ◼ 문제풀이

    # 스레드(Thread)

    싱글 스레드(Single thread)

    멀티 스레드(Multi thread)

     생성, 실행

     스레드 동기화

     상태 제어

    # 자바 가상 머신(JVM)

    JVM 메모리 구조

    가비지 컬렉션(Garbage collection)

    🌼 학습한 것들

    Stream.concat(stream1, stream2)

    ◼ 멀티 스레딩을 위한 스레드 생성, 실행

     - 1-1. Runnable 인터페이스를 구현한 클래스에 작업 작성 (run())

       > 구현 객체를 인자로 전달하면서 Thread 객체 생성

     - 1-2. Thread를 상속받은 하위 클래스에 작업 작성

       > 구현 클래스를 인스턴스화

     +) 클래스를 생성하지 않아도 익명 객체를 사용하여 생성 가능

     - 2. 작업 스레드 실행(start())

     - * 엄밀히 말해 start()는 스레드를 실행시켜주는 것이 아닌, 프로세스 스케줄러가 알맞게 할당할 수 있도록 state를 실행 대기상태로 바꾸어 두는 것. 

    ◼ 스레드 이름 설정 가능

     - 스레드 참조변수.setName() / Thread.currentThread.setName()

    ◼ 스레드 동기화

     - 여러 스레드가 동일한 데이터를 공유하면서 생기는 문제 해결

     - 임계영역을 지정하여 스레드에게 락을 획득/반납할 수 있도록 해야함.

     - 1. 메서드 전체를 임계영역으로: 메서드 시그니처의 반환타입 앞에 "synchronized" 키워드 삽입

     - 2. 특정 영역을 임계영역으로: synchronized(대상 객체 this) { 동기화 블럭 지정 }

    ◼ 자바 실행 엔진이 Runtime Data Area에 적재된 바이트 코드 실행하는 방법

     - 인터프리터: 한 줄씩 번역 및 실행

     - JIT Compiler: 코드 전체를 번역 및 실행

     - 기본적으로 인터프리터 방식이나 특정 코드가 자주 실행되면 JIT 컴파일러 통해 실행

    ◼ Method Frame

     - 메서드 호출 시, 여러 변수 및 연산 결과 등을 저장하는 공간. stack 영역에 적재

    ◼ 객체를 다룬다

     - stack 영역에 저장된 참조변수를 통해, heap 영역에 존재하는 객체를 다룬다.

    ◼ Garbage Collection (GC)

     - 기존 인스턴스와 연결이 끊어졌을 때, (null 할당 등으로) 이전 객체는 아무도 참조하지 않게 됨

      -> 메모리 점유 해제

    ◼ heap 영역

     - Young: 새롭게 생성된 객체 할당. Minor GC 활동 영역

     - Old: 상태를 유지하고 살아남은 객체 복사됨 Major GC 활동 영역

    ◼ 기본적인 GC 방식

     - 1. Stop the world: GC 스레드 제외 모든 스레드 작업 중단 (정리 완료 후 재개)

     - 2. Mark and Sweep: 사용/미사용 메모리 식별(Mark), 미사용 메모리 제거(Sweep)

    🔥 보충이 필요한 것들

    Stream 매핑

    익명 객체를 통한 스레드 생성

    ◼ 스레드 상태, 실행 제어

     

    💨 하루를 마치며

    1. 갈수록 공부 내용이 많아지는 중이라서 재미있기도 하고 좌절하기도 하는 중이다.

    2. 오늘은 어제보다 많이 학습하는 게 수월했다. 코플릿도 문제없이 마쳤다.

    3. 더 많이 써보고, 더 많이 만들어보는 게 중요하다. 당장 생각한 대로 손이 안 가는 것은 그럴 수 있지만 그림마저 그려지지 않고 뭐부터 손대야할 지 모르는 지경이 되지 않도록 많이많이 연습하는 데에 집중해서 계획을 세워야겠다.

    반응형

    댓글