본문 바로가기
부트캠프/백

11.15 스레드1, JVM

by 티코딩 2022. 11. 16.

ㅇ Thread

어떤 애플리케이션이 실행되면 운영체제가 해당애플리케이션에 메모리를 할당해주고 애플리케이션이 실행되는데, 실행중인 애플리케이션을 프로세스라고 . 프로세스 내에서 실행되는 소스 코드의 실행 흐름을 스레드라고 .

 

ㅇ 프로세스와 스레드

프로세스 - 실행중인 애플리케이션

프로세스는 데이터, 컴퓨터 자원, 스레드로 구성됨. 스레드는 데이터와 애플리케이션이 확보한 자원을 활용하여 소스 코드를 실행함.

스레드 - 하나의 코드 실행 흐름

 

ㅇ 메인 스레드

자바에서 가장 먼저 실행되는 메서드는 main메서드이다. 메인 스레드가 main 메서드를 실행시킨다. 

메인스레드만 가지는 싱글스레드 프로세스, 메인스레드에서 다른 스레드 생성해 실행하면 멀티 스레드

 

ㅇ 멀티 스레드

하나의 프로세스는 여러개의 스레드를 가질 수 있고 그러면 멀티 스레드 프로세스라고 함.

여러개의 스레드를 가진다는 것은 여러 스레드가 동시에 작업을 수행할 수 있음.

 

ㅇ 작업스레드 생성과 실행

스레드가 수행할 코드도 클래스 내부에 작성해주어야 하며, run() 메서드 내에 스레드가 처리할 작업을 작성하도록 되어있다.

run() 메서드는 Runnable 인터페이스와 Tread클래스에 정의되어있음

run()사용방법

1. Runnable 인터페이스 구현한 객체에서 run()을 구현해 스레드를 생성&실행

class Threadex implements Runnable{
    public void run(){}
}

그 다음 run메서드 바디에 실행할 코드 적으면 됨. 예를 들어 반복문을 적는다.

그 다음 Runnable 구현 객체 인자로 전달해 Thread 클래스 인스턴스화함.

Thread thread1 = new Thread(new Threadex);

그 다음 start() 메서드를 호출해 스레드를 실행시킴.

thread1.start();

main문에 반복문을 작성해서  실행시켜보면, run()메서드 내부에있는 반복문과 main문의 반복문이 섞여서 출력된다.

메인스레드와 작업 스레드가 동시에 병렬로 실행되기때문이다.

 

2. Thread 클래스 상속 받은 하위 클래스에서 run()을 구현해 스레드를 생성&실행

Thread클래스 상속받는 클래스를 만든다.

class Threadex extends Thread{
    public void run(){}
}

위에서와 마찬가지로 run()의 바디를 적어주고(예를들어 반복문), 스레드를 생성한다.

Threadex thread2 = new Threadex();

위에서와 마찬가지로 start() 실행

thread2.start();

메인문에 반복문 작성하면

1번 방법과 마찬가지로 유사한 결과가 나온다.

 

3. 익명구현 객체를 활용한 스레드 생성&실행

main문 안에 익명구현 객체를 만들어 생성&실행 가능

Runnable

Thread thread1 = new Thread(new Runnable() {
    @Override
    public void run() {
        for(int i =0; i <100; i++){
            System.out.println("#");
        }
    }
});

Thread

Thread thread2 = new Thread() {
    @Override
    public void run() {
        for(int i =0; i <100; i++){
            System.out.println("#");
        }
    }
};

 

ㅇ 스레드의 이름

조회 -> 스레드의_참조값.getName()

설정 -> 스레드의_참조값.setName()

 

ㅇ JVM(Java Virtual Machine)

자바 프로그램을 실행시키는 도구로, JVM을 통해 자바는 운영체제로부터 독립적이다. JVM은 각 운영체제별 적합한 버전이 존재함.

고로 JVM은 자바 소스코드를 운영체제에 맞춰 변환해서 실행시켜준다. 

 

ㅇ JVM의 구조

자바로 소스 코드 작성후 실행하면, 컴파일러가 실행되며 컴파일이 진행된다. .java 확장자가 .class확장자의 바이트코드 파일로 변환됨.

다음으로 JVM은 운영체제로부터 메모리를 할당받음(런타임 데이터 영역). 그다음 클래스 로더가 이 파일을 JVM내부로 불러 런타임 데이터 영역에 적재시키고, 실행 엔진이 런타임 데이터 영역에 적재된 바이트 코드를 실행시킴.

 

ㅇ JVM 메모리 구조

위에서 운영체제로부터 메모리를 할당 받는 런타임 데이터영역은 5가지 영역으로 나뉘어있다.

1. Method Area

2. Heap Area

3. Stack Area

4. PC Register

5. Native Method Stack

 

ㅇ Stack 영역

스택은 자료구조로 프로그램이 말그대로 데이터가 프링글스 통같은데서 쌓이면서 저장되는 형태다.

고로 가장 마지막에 저장된 데이터가 가장 먼저나가는 LIFO(Last In First Out)형태다.

여기엔 메서드가 호출되면 Method Frame이 생성되고 거기에 메서드에 사용되는 다양한 값들이 임시로 저장되며

메서드의 동작이 끝나면 역순으로 제거됨.

 

ㅇ Heap 영역

Heap영역엔 객체, 인스턴스 변수, 배열이 저장된다.

객체를 다룬다는 것은 Stack영역에 저장되어있는 참조변수 통해 Heap영역에 존재하는 객체를 다룬다는 것이다.

Heap에는 실제 객체의 값이 저장된다.

 

ㅇ Garbage Collection

메모리를 자동으로 관리하는 프로세스가 포함되어 있다. 더이상 사용되지않는 객체를 찾아 삭제 해준다. Heap영역에서

객체가 얼마나 오래 남아있냐에따라 Young영역과 Old영역으로 나뉘는데, 상대적으로 오래 남는 Old 영역은 Young영역보다 크고

가비지가 적게 발생한다.

작동방법은 기본적으로

1. Stop the World - 가비지 컬렉션을 실행하기 위해 실행을 멈춘다. 정리되면 재개

2. Mark and Sweep - 사용되는메모리와 안되는 메모리를 선별후 메모리 해제.

'부트캠프 > ' 카테고리의 다른 글

11.17 재귀  (0) 2022.11.18
11.15 Thread2  (0) 2022.11.16
11.14 Annotation, Lambda, Stream  (0) 2022.11.14
11.11 컬렉션 연습문제  (0) 2022.11.14
11.10 enum, 제네릭, 예외, 컬렉션 프레임워크  (0) 2022.11.14