1

多くの CPU を消費するスレッドがいくつかあり、それらを見つけたいと考えています。

私はLinuxマシンを使用しています。スー。トップスレッドを使用してスレッドをオンにすると、CPU を大量に消費するスレッドが表示されます。

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+   PPID COMMAND                                        
28597 acrosspm  20   0 3682m 2.8g  23m R   99  4.4 128:51.01 28481 java                                           
28593 acrosspm  20   0 3682m 2.8g  23m R   97  4.4 129:03.77 28481 java                                           
28598 acrosspm  20   0 3682m 2.8g  23m R   97  4.4 129:12.65 28481 java                                           
28600 acrosspm  20   0 3682m 2.8g  23m R   97  4.4 128:59.34 28481 java                                           
28610 acrosspm  20   0 3682m 2.8g  23m R   97  4.4 129:18.72 28481 java 

しかし、jstack -F 28481 を使用すると、最もビジーなスレッド ID と一致しません。

jconsole と jvisualvm を使用しようとしました。jmxが壊れていると思うので、どれもスレッドデータをサンプリングできません(プロセスのCPUが2000%にジャンプする前にjmx経由で接続できます)

CPUを消費するスレッドのコールスタックを見つけることができる他の方法はありますか?

どうもありがとう。


スレッド ダンプの一部は次のようになります。

Thread 28641 "MSC service thread 1-2": (state = BLOCKED)
    at sun.misc.Unsafe.park(Native Method)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)

Thread 28640 "MSC service thread 1-1": (state = BLOCKED)
    at sun.misc.Unsafe.park(Native Method)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)

Thread 28638 "Reference Reaper": (state = BLOCKED)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x00000007825b8268> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
    - locked <0x00000007825b8268> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
    at org.jboss.modules.ref.References$ReaperThread.run(References.java:68)

VM Thread 28636 "Service Thread": (state = BLOCKED)

VM Thread 28635 "C1 CompilerThread14": (state = BLOCKED)

VM Thread 28634 "C1 CompilerThread13": (state = BLOCKED)

VM Thread 28633 "C1 CompilerThread12": (state = BLOCKED)

VM Thread 28632 "C1 CompilerThread11": (state = BLOCKED)

VM Thread 28631 "C1 CompilerThread10": (state = BLOCKED)

VM Thread 28630 "C2 CompilerThread9": (state = BLOCKED)

VM Thread 28629 "C2 CompilerThread8": (state = BLOCKED)

VM Thread 28628 "C2 CompilerThread7": (state = BLOCKED)

VM Thread 28627 "C2 CompilerThread6": (state = BLOCKED)

VM Thread 28626 "C2 CompilerThread5": (state = BLOCKED)

VM Thread 28625 "C2 CompilerThread4": (state = BLOCKED)

VM Thread 28624 "C2 CompilerThread3": (state = BLOCKED)

VM Thread 28623 "C2 CompilerThread2": (state = BLOCKED)

VM Thread 28622 "C2 CompilerThread1": (state = BLOCKED)

VM Thread 28621 "C2 CompilerThread0": (state = BLOCKED)

VM Thread 28620 "JDWP Event Helper Thread": (state = BLOCKED)

VM Thread 28619 "JDWP Transport Listener: dt_socket": (state = BLOCKED)

Thread 28618 "Signal Dispatcher": (state = BLOCKED)

Thread 28617 "Finalizer": (state = BLOCKED)
    at java.lang.Object.wait(Native Method)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
    - locked <0x0000000782459cf0> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
    at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:189)

Thread 28616 "Reference Handler": (state = BLOCKED)
    at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:125)
    - waiting to lock <0x0000000781816e20> (a java.lang.ref.Reference$Lock)
4

1 に答える 1

2

これらのスレッドはすべてガベージ コレクション スレッドであることがわかります。

私たちのプログラムは非常に大きなオブジェクトを生成し、メモリに保持します。

ヒープが少なくなると、gc スレッドが作業を行います。これらのオブジェクトはすべて古い領域にあり、どれも解放できないため、スレッドは FGC を実行し続けます。

そのため、CPUが非常に高くなります。

于 2013-09-28T03:02:09.380 に答える