[Linux] Process Address

프로그램은 실행 가능한 바이너리와 바이너리가 실행되기 위해 필요한 데이터(라이브러리 등)으로 구성된다.
프로그램은 사용자에 의해서 실행되면 커널로 부터 CPU, 메모리 자원을 할당받고 프로세스로 실행된다.
이때 프로세스는 Process Address Space 구조에 의해 코드/데이터/힙/스택 영역으로 구분된 메모리 영역을 할당받는다. (https://jhnyang.tistory.com/32)

프로세스가 실행 중에 쓰레드를 생성하면 코드/데이터/힙 메모리 영역은 공유하고 스택 메모리에 해당 쓰레드를 위한 스택만 생성한다.
리눅스 커널은 메모리를 관리할때 프로세스가 요청하는 메모리를 가상 메모리는 할당하지만 실제 메모리는 사용할때 할당된다. (첨부된 메일의 memory.c 코드를 통해 확인)
해당 이슈처럼 과도하게 쓰레드가 생성되는 경우(과도하게 생성되었다기 보다 사용이 완료된 쓰레드 자원이 정리되지 않은 것으로 보임) 실제 시스템에 메모리는 충분하지만 스택 메모리를 할당하기 위한 가상 메모리 주소 공간이 부족할 경우가 발생할수 있다.
그렇기 때문에 해당 이슈는 JVM에서 java.lang.OutOfMemoryError: thread creation failed 로그를 출력하고 새로운 쓰레드 생성을 위한 스택 메모리를 할당하지 못하는 것이다.

이 글은 카테고리: Linux에 포함되어 있습니다. 고유주소를 북마크하세요.

댓글 남기기