Programming Language/Java

[Java/Error] OutOfMemoryError: unable to create new native thread

Ma_Sand 2024. 9. 5. 23:25
반응형

프로그램 테스트를 하다가 다음의 에러가 발생하였다.

14:25:10.187 [http-nio-8085-exec-8] WARN  io.netty.channel.AbstractChannel - Force-closing a channel whose registration task was not accepted by an event loop: [id: 0xc83c8a8c]
java.lang.OutOfMemoryError: unable to create new native thread
        at java.lang.Thread.start0(Native Method) ~[?:1.8.0_265]
        at java.lang.Thread.start(Thread.java:717) ~[?:1.8.0_265]
        at io.netty.util.concurrent.ThreadPerTaskExecutor.execute(ThreadPerTaskExecutor.java:32) ~[netty-all-4.1.58.Final.jar:4.1.58.Final]
        at io.netty.util.internal.ThreadExecutorMap$1.execute(ThreadExecutorMap.java:57) ~[netty-all-4.1.58.Final.jar:4.1.58.Final]
        at io.netty.util.concurrent.SingleThreadEventExecutor.doStartThread(SingleThreadEventExecutor.java:978) ~[netty-all-4.1.58.Final.jar:4.1.58.Final]
        at io.netty.util.concurrent.SingleThreadEventExecutor.startThread(SingleThreadEventExecutor.java:947) ~[netty-all-4.1.58.Final.jar:4.1.58.Final]
        at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:830) ~[netty-all-4.1.58.Final.jar:4.1.58.Final]
        at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:818) ~[netty-all-4.1.58.Final.jar:4.1.58.Final]
        at io.netty.channel.AbstractChannel$AbstractUnsafe.register(AbstractChannel.java:471) [netty-all-4.1.58.Final.jar:4.1.58.Final]
        at io.netty.channel.SingleThreadEventLoop.register(SingleThreadEventLoop.java:87) [netty-all-4.1.58.Final.jar:4.1.58.Final]
        at io.netty.channel.SingleThreadEventLoop.register(SingleThreadEventLoop.java:81) [netty-all-4.1.58.Final.jar:4.1.58.Final]
        at io.netty.channel.MultithreadEventLoopGroup.register(MultithreadEventLoopGroup.java:86) [netty-all-4.1.58.Final.jar:4.1.58.Final]
        at io.netty.bootstrap.AbstractBootstrap.initAndRegister(AbstractBootstrap.java:323) [netty-all-4.1.58.Final.jar:4.1.58.Final]
        at io.netty.bootstrap.Bootstrap.doResolveAndConnect(Bootstrap.java:155) [netty-all-4.1.58.Final.jar:4.1.58.Final]
        at io.netty.bootstrap.Bootstrap.connect(Bootstrap.java:116) [netty-all-4.1.58.Final.jar:4.1.58.Final]
        ...

위 에러는 자바 애플리케이션이 새로운 스레드를 생성할 수 없을 때 발생한다. 보통 다음의 원인으로 발생할 수 있다.

  • 스레드 제한 초과: JVM에서 허용하는 최대 스레드 수 초과
  • 메모리 부족: 시스템 메모리가 부족하여 새로운 스레드를 생성할 수 없음
  • 무한 루프: 스레드가 계속해서 생성되고 종료되지 않음

나의 경우에는 메모리 부족인 듯하여 free -h 명령어로 현재 시스템의 메모리 사용량을 확인하였다.

테스트 중인 서버 OS가 CentOS 계열(Linux)이라서 free 명령어를 사용했는데, 만약 macOS에서 메모리를 확인하려면 top 명령어를 사용하면 된다.

# CentOS, RHEL 계열
free -h

# macOS
top -l 1 -s 0 | grep PhysMem

 

예시사진

free -h 입력했을 때 위 사진과 같은 내용이 출력된다. 메모리 부분을 보면 used(사용된 메모리)와 free(사용되지 않은 메모리)가 있는데, 나의 경우에는 총 15.8G 중에 약 15.0G 정도를 사용하고 있었다.

 

서버에서 불필요한, 사용하지 않는 디렉토리를 전부 삭제하고 테스트 중인 프로그램을 재기동했다.

여전히 똑같은 에러가 발생했다.

혹시나 해서 VM을 재기동해보았는데, 다행히 에러 없이 정상적으로 프로그램 기능이 작동하였다.

 

반응형