java.lang.OutOfMemoryError: unable to create new native thread 오류 해결
이 오류가 발생하는 이유는 Java VM(자바 가상 머신)이 Thread를 생성하는데 너무 많은 Thread를 생성해서 그 이상의 Thread를 생성할 수 없기 때문에 발생하는 오류입니다.
제가 프로그래밍을 하면서 코딩을 잘못하게 되면 아래와 같은 현상이 발생합니다.
Thread를 사용할 때 잘못된 코딩으로 Thread가 반복해서 생성이 된 경우입니다.
사실 Thread가 무수히 많게 생성이 된 경우가 아니더라도 프로그램이 가지고 있는 자바 가상 머신에 할당된 메모리가 부족할 경우에 java.lang.OutOfMemoryError가 발생할 수 있습니다.
이때는 2번째 방법에서 기술한 JVM의 할당된 메모리를 강제적으로 늘리는 방법으로 해결할 수 있습니다.
1. Thread 생성 코드를 수정
첫번째 방법으로는 Thread를 생성하는 쪽의 코드를 수정하는 것입니다.
저 같은 경우는 클라이언트 쪽에서 서버와 계속적인 연결을 필요로 했기 때문에
Thread를 통해 반복적으로 서버와 연결하도록 1초마다 설정했는데 그 부분이 문제가 있어서 코드를 수정함으로 문제를 해결 했습니다.
위와 같은 상황은 메모리 누수와 낭비로 이루어지기 때문에 좋지 않은 프로그램입니다.
2. 자바 가상머신의 메모리 할당 설정 변경
필수적으로 많은 Thread가 필요할 경우에는 자바 가상머신의 메모리 할당을 강제적으로 늘리는 방법으로 해결합니다.
JAVA_OPTS = -Xms128m -Xmx1303m -Xss256k
JAVA_OPTS에서 설정을 바꾸는 방법입니다.
Xms는 처음 JVM이 로드될 때 부여하는 메모리
Xmx는 JVM이 가질 수 있는 최대 메모리
Xss는 JVM에서 사용하는 Thread Stack의 크기입니다.
Xss는 256k또는 128k, 64k 정도로 줄여도 무관합니다.
이 옵션을 설정하기 위해서 Eclipse - Run - Run Configurations...
적용할 프로젝트 선택 - Arguments 탭
VM arguments에 -Xms128m -Xmx1303m -Xss256k 입력 후 Apply.
이렇게 설정하면 Thread가 많이 생성이 되어도 JVM이 가지고 있는 메모리 여유에 한해서는 오류가 발생하지 않습니다만, 첫번째 방법으로 왜 Thread가 많이 생성이 되고 있는지 그 원인을 파악하고 해결하는 것이 좋습니다.
'Java > 오류해결' 카테고리의 다른 글
[오류해결] No goals have been specified for this build (Maven) (3) | 2020.09.03 |
---|---|
[오류해결] java.net.MalformedURLException: no protocol (1) | 2020.06.15 |
[오류해결] *.jar에 기본 Manifest 속성이 없습니다. (0) | 2020.05.22 |