-
OutOfMemoryError: unable to create new native thread 원인리눅스 2020. 6. 2. 17:39
최근 프로젝트를 Server에 반영하고 Tomcat을 재시작 하거나 프로세스가 정상적으로 올라가고 몇시간 후에도
OutOfMemoryError 로그와 함께 기존의 프로세스가 먹통이 되는 현상이 자주 발생하였다.
OutOfMemoryError 문구만 봐서는 해당 에러가 메모리와 관련된 오류일 것이라고 생각하기 쉽다.
하지만 Java 1.6과 1.7에서 OS가 Thread를 생성해 주지 못할 때 OutOfMemoryError: unable to create new native thread 에러가 표시될 수 있다.
Linux에서 사용자가 생성할 수 있는 최대 프로세스 개수를 확인하는 방법 중 하나는 ulimit 을 이용하는 것이다.
>ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 62341 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 10240 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 10240 cpu time (seconds, -t) unlimited max user processes (-u) 1024 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
프로세스 생성과 관련된 값은 "max user processes"이다.
해당값만 보고 싶다면
>ulimit -u
1024Java 프로세스가 자식 프로세스 모두 합쳐서 해당 값보다 많은 수의 Thread를 생성하려고 한다면 OutOfMemoryError: unable to create new native thread에러가 발생하게 된다.
max user processes 값 변경 방법
>ulimit -u 65535max user processes 값을 65535으로 변경해준 후 OutOfMemoryError에 대한 에러는 발생하지 않았다.
위와 같이 할 경우 재부팅 되거나 세션이 새로 열리면 변경된 값이 적용되지 않는다.
재부팅이나 새 세션에도 해당값을 유지하려면 /etc/security/limits.conf 파일을 편집한 후 재부팅해야 한다.
>vi /etc/security/limits.conf
대략적으로 주석을 보면 어떻게 하는지 알 수 있다.
파일 제일 끝에 아래와 같이 추가한다. 이미 비슷한 라인이 있으면 편집한다.
* hard nproc 65535
* soft nproc 65535
특정 유저만 해당값을 설정하고 싶으면 '*'대신에 ID를 넣어준다.
hadoop hard nproc 65535
hadoop soft nproc 65535파일 편집을 마친 후 재부팅 해야 해당 값이 적용된 다는 것을 잊지 말자.
'리눅스' 카테고리의 다른 글
3장 3교시 : 우분투 설치3(Client) (0) 2020.06.07 3장 2교시 : 우분투 설치2(Server(B)) (0) 2020.06.03 3장 1교시 : 우분투 설치1(Server) (0) 2020.06.01 2장 1교시 : 우분투 리눅스 소개 (0) 2020.06.01 1장 3교시 : VMware 특징과 네트워크 환경 설정 (0) 2020.06.01