Java 스레드 작성은 비용이 많이 듭니다.
- 스레드 스택에 대해 큰 메모리 블록을 할당하고 초기화해야합니다.
- 호스트 OS에 원시 스레드를 작성 / 등록하려면 시스템 호출이 필요합니다.
- 설명자는 작성하고 초기화하여 JVM 내부 데이터 구조에 추가해야합니다.
스레드가 살아있는 한 리소스를 묶는다는 점에서 비싸다. 예를 들어 스레드 스택, 스택에서 도달 할 수있는 모든 객체, JVM 스레드 설명자, OS 기본 스레드 설명자
이 모든 것들의 비용은 플랫폼에 따라 다르지만 내가 본 Java 플랫폼에서는 저렴하지 않습니다.
Google 검색에서 2002 빈티지 Linux를 실행하는 2002 빈티지 듀얼 프로세서 Xeon의 Sun Java 1.4.1에서 초당 ~ 4000 스레드 생성 속도를보고 하는 오래된 벤치 마크 를 발견했습니다 . 더 현대적인 플랫폼은 더 나은 숫자를 줄 것입니다 ... 방법론에 대해서는 언급 할 수 없지만 ... 적어도 스레드 생성 비용 이 얼마나 드는지에 대한 야구장을 제공 합니다.
Peter Lawrey의 벤치마킹은 요즘 스레드 생성이 절대적으로 훨씬 빠르다는 것을 보여 주지만, Java 및 / 또는 OS ... 또는 더 높은 프로세서 속도의 개선이 어느 정도인지는 확실하지 않습니다. 그러나 스레드 풀을 사용하고 매번 새 스레드를 작성 / 시작하면 그의 숫자는 여전히 150 배 이상 향상되었습니다. (그리고 그는 이것이 모두 상대적이라는 것을 강조합니다 ...)
(위의 내용은 "그린 스레드"가 아닌 "네이티브 스레드"를 가정하지만 최신 JVM은 모두 성능상의 이유로 네이티브 스레드를 사용합니다. 그린 스레드는 훨씬 저렴하지만 다른 지역에서는 비용을 지불합니다.)
Java 스레드의 스택이 실제로 어떻게 할당되는지 확인하기 위해 약간의 파기를 수행했습니다. Linux에서 OpenJDK 6의 경우 스레드 스택은 pthread_create
기본 스레드를 작성하는 호출에 의해 할당됩니다 . (JVM은 pthread_create
사전 할당 된 스택을 전달하지 않습니다 .)
그런 다음 pthread_create
스택 내 에서 mmap
다음과 같이 호출하여 할당됩니다 .
mmap(0, attr.__stacksize,
PROT_READ|PROT_WRITE|PROT_EXEC,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
에 따르면 man mmap
, MAP_ANONYMOUS
플래그는 메모리가 0으로 초기화되도록한다.
따라서 (Java 사양에서) 새로운 Java 스레드 스택을 제로화 할 필요는 없지만 실제로는 (적어도 Linux에서는 OpenJDK 6에서는) 제로화됩니다.