ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
    1024

     

    Java 프로세스가 자식 프로세스 모두 합쳐서 해당 값보다 많은 수의 Thread를 생성하려고 한다면 OutOfMemoryError: unable to create new native thread에러가 발생하게 된다.

     

     

    max user processes 값 변경 방법
    >ulimit -u 65535

     

    max 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

     

    파일 편집을 마친 후 재부팅 해야 해당 값이 적용된 다는 것을 잊지 말자.

Designed by Tistory.