상황 가정
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 |