0

많은 대기 시간을 초래하므로 컨텍스트 스위칭을 피하려고합니다. 그래서 내가 올바르게 생각한다면, 나는 프로세서 당 최대 하나의 쓰레드를 원한다. 프로세서가 가상 병렬 처리를 지원한다면 (하이퍼 스레딩은 이름이라고 생각합니다!) 그러면 스레드 수를 두 배로 늘릴 수 있습니다.JVM을 시작할 때 몇 개의 스레드가 포크합니까?

예 : 하이퍼 스레딩이 4 개인 프로세서 = 최대 8 개 스레드.

물론 OS에도 프로세서가 필요하므로 당연히 여기 순진합니다.

어쨌든 JVM이 시작시 생성하는 스레드의 수를 알고 있으면 좋은 시작입니다.

+0

예, 당신은 조금 순진합니다. GC는 멀티 프로세서 시스템에서 일부 GC 알고리즘으로 줄일 수 있지만 CPU 수에 관계없이 항상 대기 시간을 발생시킵니다. 낮은 대기 시간을 보장하려면 Java를 피하십시오. (그리고 바람직하지 않은 모든 비 실시간 OS들.) – biziclop

+2

주제에서 약간 벗어난, 따라서 코멘트. "그렇다면 제대로 생각하고 있다면 프로세서 당 최대 하나의 스레드를 갖고 싶습니다" 스레드가 100 % 항상 작동하고 잠금을 사용하지 않는다면 실제로 생각만큼 좋은 생각은 아닙니다. I/O 또는 다른 것. 물론 과용하지 말아야하지만 대부분의 경우 코어 수나 HW 스레드 수만큼 스레드 수를 줄이려고하면 CPU를 최대한 활용하지 못할 것입니다. – Fredrik

+0

"대기 시간이 많이 걸리는 컨텍스트 전환을 피하려고합니다." 그거야? 측정 했니? – EJP

답변

4

JVM은 "기본"스레드라고도하는 1 개의 사용자 스레드 만 시작합니다.

public static void main(String[] args) throws Exception { 
    Thread.sleep(100000); 
} 

쇼 : 등등 쓰레기 수집, 컴파일러, 최적화, 파이 나라, 등 뒤에서 실행중인 다른 스레드에 .. 아무것도 작은 응용 프로그램을위한 스레드 덤프에서

얼핏가 있습니다 :

"Low Memory Detector" daemon prio=5 tid=7f810c801000] 
"C2 CompilerThread1" daemon prio=9 tid=7f810c800000 
"C2 CompilerThread0" daemon prio=9 tid=7f8107037000 
"Signal Dispatcher" daemon prio=9 tid=7f8107036000 
"Surrogate Locker Thread (Concurrent GC)" daemon prio=5 tid=7f8107801000 
"Finalizer" daemon prio=8 tid=7f810882a000 nid=0x1118cb000 
"Reference Handler" daemon prio=10 tid=7f8108829000 nid=0x1117c8000 
"main" prio=5 tid=7f8104801000 nid=0x109a52000 waiting on condition 
"VM Thread" prio=9 tid=7f8108824800 nid=0x1116c5000 runnable 
"Gang worker#0 (Parallel GC Threads)" prio=9 tid=7f8104802800 
"Gang worker#1 (Parallel GC Threads)" prio=9 tid=7f8104803000 
"Gang worker#2 (Parallel GC Threads)" prio=9 tid=7f8104803800 
"Gang worker#3 (Parallel GC Threads)" prio=9 tid=7f8107800000 
"Gang worker#4 (Parallel GC Threads)" prio=9 tid=7f8108800000 
"Gang worker#5 (Parallel GC Threads)" prio=9 tid=7f8107000800 
"Gang worker#6 (Parallel GC Threads)" prio=9 tid=7f8107001000 
"Gang worker#7 (Parallel GC Threads)" prio=9 tid=7f8107002000 
"Concurrent Mark-Sweep GC Thread" prio=9 tid=7f810701c000 
"Gang worker#0 (Parallel CMS Threads)" prio=9 tid=7f81090c3000 
"Gang worker#1 (Parallel CMS Threads)" prio=9 tid=7f810701b800 
"VM Periodic Task Thread" prio=10 tid=7f810c812800 
"Exception Catcher Thread" prio=10 tid=7f8104801800 
+0

각 스레드에 하나의 프로세서를 제공하여 컨텍스트 전환을 피하려는 경우 JVM이이 단일 사용자 스레드 외에 생성하는 총 스레드 수를 알아야할까요? – JohnPristine

+0

나는 그렇게 생각하지 않는다 @ 존프 크리스틴. 얼마나 많은 사용자 스레드를 실행하여 응용 프로그램을 "최대화"해야하는지 묻는다면 가비지 수집기에 1을 할당합니다. 나머지는 중요한 시간을 차지하지 않아야합니다. – Gray

+0

물론'finalize()'메소드 (무한 루프 예 : :)에 넣는 것에 따라 finalizer 쓰레드는 전체 코어 자체를 차지할 수도 있습니다. – biziclop

관련 문제