본문 바로가기
Back-end

스레드를 무한정 만든다면?

by 신재권 2023. 8. 31.

상황 가정

public class Main {

	public static void main(String[] args) {
		while (true) {
			Test test = new Test();
			test.start();
		}
	}

	private static class Test extends Thread {
		@Override
		public void run() {
			try {
				Thread.sleep(Long.MAX_VALUE);
			} catch (InterruptedException e) {
				throw new RuntimeException(e);
			}
		}
	}

}

스레드를 무한정 생성해 sleep 시켜본다.

이때 무슨 상황이 발생할까?

결과

Exception in thread "main" java.lang.OutOfMemoryError: unable to create native thread: possibly out of memory or process/resource limits reached

OOM이 발생하게 된다

왜 OOM이 발생하는가?

OOM은 메모리 부족 상황으로, 필요한 메모리를 할당할 수 없을 때 발생한다.

각 스레드는 개별적으로 스택 메모리가 할당된다.

만약 무한정 만든다면 JVM에 할당된 메모리를 계속 사용하며 만들게된다.

즉, 무한정 만들게 되면, 언젠가는 JVM에 할당된 메모리를 모두 사용하고, 스레드를 만들지 못하는 상황이 발생한다.

왜 오류내용은 네이티브 스레드를 못 만든다고 할까?

자바는 스레드를 생성하고, 내부 네이티브 메서드를 통해 네이티브 스레드를 생성해 매핑하는데, 이 작업이 불가하다고 알려주는 것이다.

wait() vs sleep()

wait()과 sleep()은 스레드를 대기시키지만, 다른 방법이다.

wait()은 스레드를 대기 상태로 만들고, notify가 호출될 때 까지 대기한다.

sleep()은 스레드를 일정 시간 동안 대기 시킨다.

sleep()은 시간 지연 목적으로 사용하고, wait()은 스레드 간의 통신과 동기화를 위해 사용된다.

'Back-end' 카테고리의 다른 글

JDK 동적 프록시, CGLIB  (0) 2023.09.08
상속보다 합성을 이용하는 이유  (0) 2023.09.06
PSA(Portable Service Abstraction)  (0) 2023.08.30
IoC/DI  (0) 2023.08.30
JDBC  (0) 2023.08.24