2012-12-04 4 views
1

Daemon 응용 프로그램을 실행하면 스레드 수는 다른 OS에 따라 다릅니다. 즉 Windows 7에서 코드가 실행될 때 동일한 스레드가 동일한 시간 동안 동일한 코드가 26 개의 스레드를 사용하는 동안 동일한 코드가 실행될 때 15 개의 스레드가 사용됩니다 (코드가 1.5 시간 동안 실행될 때).스레드 수는 OS마다 다릅니다.

참고 : 동일한 프로그램 코드가 두 시스템에서 모두 사용됩니다. 내 의심의 여지가, Windows는 32 비트이고 Mac OS는 64 비트입니다.

스레드 수가 다른 이유는 무엇일까요?


거기에 어떤 도움을 크게 감상 할 수가 .. 당신의 해결과 솔루션을 공유하기위한 여러분 모두 감사합니다. 마침내 Mac에서 데몬의 스레드 덤프를 가져 와서 일부 잠금이 thread에 있는지 확인할 수있었습니다. 그러나 여전히 Mac OS의 스레드 수가 항상 Windows 7 스레드 수보다 낮게 유지 된 이유는 여전히 알지 못합니다. 아래에서 잠금이있는 스레드 덤프를 찾으십시오. 이러한 스레드는 당신이 jstack하여 스택과 이름을 얻을 수 JVM 프로세스에 의해 생성되는 경우

"DefaultUDPTransportMapping_10.190.146.17/0" - Thread [email protected] 
    java.lang.Thread.State: RUNNABLE 
       at java.net.PlainDatagramSocketImpl.receive0(Native Method) 
       - locked [email protected] 
       at java.net.PlainDatagramSocketImpl.receive(PlainDatagramSocketImpl.java:136) 
       - locked [email protected] 
       at java.net.DatagramSocket.receive(DatagramSocket.java:712) 
       - locked [email protected] 
       - locked [email protected] 
       at org.snmp4j.transport.DefaultUdpTransportMapping$ListenThread.run(DefaultUdpTransportMapping.java:345) 
       at java.lang.Thread.run(Thread.java:637) 


"RMI TCP Accept-0" - Thread [email protected] 
    java.lang.Thread.State: RUNNABLE 
       at java.net.PlainSocketImpl.socketAccept(Native Method) 
       at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:390) 
       - locked [email protected] 
       at java.net.ServerSocket.implAccept(ServerSocket.java:453) 
       at java.net.ServerSocket.accept(ServerSocket.java:421) 
       at sun.management.jmxremote.LocalRMIServerSocketFactory$1.accept(LocalRMIServerSocketFactory.java:34) 
       at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:369) 
       at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(TCPTransport.java:341) 
       at java.lang.Thread.run(Thread.java:637) 
+0

코드를 보여주십시오. –

+0

스레드를 사용할 수있는 프레임 워크를 사용합니까? 어쩌면 네이티브 코드가 쓰레드를 생성하고 다른 플랫폼에서 반드시 동일하지 않을 수도 있습니다. – zeller

+1

나는 당신의 애플리케이션에 의해 생성 된 실제 쓰레드 수는 같다고 생각 하겠지만 JVM은 구현에 따라 다른 수의 쓰레드를 사용한다. – assylias

답변

1

(예를 들어). 결과물에서 얻을 수있는 정보는 질문에 답할 수있을만큼 충분해야합니다. 단일 스레드 응용 프로그램 jstack 내 컴퓨터에 예를 들어 나에게주는이 : 그들이 누구인지는 알아낼 수 있도록 잘

Full thread dump Java HotSpot(TM) 64-Bit Server VM (23.5-b02 mixed mode): 

"Attach Listener" daemon prio=5 tid=0x00007f985a800000 nid=0x3e07 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE 

"Service Thread" daemon prio=5 tid=0x00007f9858871800 nid=0x4f03 runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE 

"C2 CompilerThread1" daemon prio=5 tid=0x00007f9858871000 nid=0x4e03 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE 

"C2 CompilerThread0" daemon prio=5 tid=0x00007f985886f000 nid=0x4d03 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE 

"Signal Dispatcher" daemon prio=5 tid=0x00007f985886e000 nid=0x4c03 runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE 

"Finalizer" daemon prio=5 tid=0x00007f9859813000 nid=0x3b03 in Object.wait() [0x00000001683c1000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) 
    - waiting on <0x0000000147a35798> (a java.lang.ref.ReferenceQueue$Lock)  at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135) 
    - locked <0x0000000147a35798> (a java.lang.ref.ReferenceQueue$Lock)  at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)  at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:177) 

"Reference Handler" daemon prio=5 tid=0x00007f9859812000 nid=0x3a03 in Object.wait() [0x00000001682be000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) 
    - waiting on <0x0000000147a35320> (a java.lang.ref.Reference$Lock) at java.lang.Object.wait(Object.java:503) at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133) 
    - locked <0x0000000147a35320> (a java.lang.ref.Reference$Lock) 

"main" prio=5 tid=0x00007f985880e000 nid=0x1107 waiting on condition [0x0000000108bd8000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at main(Example.java:24) 

"VM Thread" prio=5 tid=0x00007f985980f800 nid=0x3903 runnable 

"GC task thread#0 (ParallelGC)" prio=5 tid=0x00007f985881c000 nid=0x3503 runnable 

"GC task thread#1 (ParallelGC)" prio=5 tid=0x00007f985881c800 nid=0x3603 runnable 

"GC task thread#2 (ParallelGC)" prio=5 tid=0x00007f985881d000 nid=0x3703 runnable 

"GC task thread#3 (ParallelGC)" prio=5 tid=0x00007f985881e000 nid=0x3803 runnable 

"VM Periodic Task Thread" prio=5 tid=0x00007f9858857800 nid=0x5003 waiting on condition 

모든 VM 스레드를 이름이 지정됩니다.