Hello Sam!
Inorder to diagnose CPU spike there is two approaches:
- Strategic/right approach
- Tactical approach
Strategic Approach:
Inorder to accurately point the lines of code causing the CPU spike, you need to analyze not only thread dumps but also 'top -H -p {PID}' command output, where {PID} is your Java application's process Id which is experiencing CPU spike. When you issue this ‘top’ command with given arguments, it will list all the threads running in the application and amount of CPU each one of the thread consume. Once you have both the data, you can identify high CPU consuming thread and lines of code they are executing.
You can use the open source yCrash script which will capture 360-degree application level artifacts (like GC logs, 3 snapshots of thread dumps, heap dumps) and system level artifacts (like top, top -H, netstat, vmstat, iostat, dmesg, diskusage, kernel parameters...). Once you have these data, either you can manually analyze them or upload it to yCrash tool. Tool analyzes all these dataset and generates an instant root cause analysis report pointing out exact line of code causing the CPU spike. Here is more detailed information on how to diagnose high CPU spike.
Tactical approach:
fastThread tool uses its heuristics algorithms and shows the potential (but not exact) threads are consuming high cpu in the section 'CPU consuming threads'. You want to refer to see the threads pointed in this 'CPU consuming threads' section.
In your case, I could following threads reported in ‘CPU consuming threads’ section to be potential suspects for CPU spike:
Thread-486 PRIORITY : 7 THREAD ID : 0X00007FA5700CB770 NATIVE ID : 0X15BD NATIVE ID (DECIMAL) : 5565 STATE : RUNNABLE stackTrace: java.lang.Thread.State: RUNNABLE at xxx.xxxxx.discord.lavaplayer.udpqueue.natives.UdpQueueManagerLibrary.process(Native Method) at xxx.xxxxx.discord.lavaplayer.udpqueue.natives.UdpQueueManager.process(UdpQueueManager.java:83) at xxx.xxxxx.discord.lavaplayer.jdaudp.NativeAudioSendFactory$$Lambda$340/0x00000008012f0838.run(Unknown Source) at java.lang.Thread.run(java.base@17.0.7/Thread.java:833) Locked ownable synchronizers: - None lava-daemon-pool-playback-1-thread-12 PRIORITY : 5 THREAD ID : 0X00007FA5403E8A10 NATIVE ID : 0X162B NATIVE ID (DECIMAL) : 5675 STATE : RUNNABLE stackTrace: java.lang.Thread.State: RUNNABLE at xxx.xxxxx.discord.lavaplayer.natives.opus.OpusEncoderLibrary.encode(Native Method) at xxx.xxxxx.discord.lavaplayer.natives.opus.OpusEncoder.encode(OpusEncoder.java:43) at xxx.xxxxx.discord.lavaplayer.format.transcoder.OpusChunkEncoder.encode(OpusChunkEncoder.java:39) at xxx.xxxxx.discord.lavaplayer.filter.BufferingPostProcessor.process(BufferingPostProcessor.java:34) at xxx.xxxxx.discord.lavaplayer.filter.FinalPcmAudioFilter.dispatch(FinalPcmAudioFilter.java:157) at xxx.xxxxx.discord.lavaplayer.filter.FinalPcmAudioFilter.process(FinalPcmAudioFilter.java:129) at xxx.xxxxx.discord.lavaplayer.filter.AudioPipeline.process(AudioPipeline.java:33) at xxx.xxxxx.discord.lavaplayer.container.common.OpusPacketRouter.passDownstream(OpusPacketRouter.java:160) at xxx.xxxxx.discord.lavaplayer.container.common.OpusPacketRouter.process(OpusPacketRouter.java:96) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaOpusTrackConsumer.consume(MatroskaOpusTrackConsumer.java:46) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaStreamingFile.processFrameInBlock(MatroskaStreamingFile.java:371) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaStreamingFile.parseClusterSimpleBlock(MatroskaStreamingFile.java:335) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaStreamingFile.parseNextCluster(MatroskaStreamingFile.java:320) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaStreamingFile.provideFrames(MatroskaStreamingFile.java:296) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaAudioTrack.lambda$process$0(MatroskaAudioTrack.java:39) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaAudioTrack$$Lambda$345/0x00000008012fd320.performRead(Unknown Source) at xxx.xxxxx.discord.lavaplayer.track.playback.LocalAudioTrackExecutor.executeProcessingLoop(LocalAudioTrackExecutor.java:275) at xxx.xxxxx.discord.lavaplayer.track.playback.LocalAudioTrackExecutor.executeProcessingLoop(LocalAudioTrackExecutor.java:249) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaAudioTrack.process(MatroskaAudioTrack.java:38) at xxx.xxxxx.discord.lavaplayer.track.DelegatedAudioTrack.processDelegate(DelegatedAudioTrack.java:25) - locked <0x00000000e4c7bdf0> (a xxx.xxxxx.discord.lavaplayer.source.youtube.YoutubeAudioTrack) at xxx.xxxxx.discord.lavaplayer.source.youtube.YoutubeAudioTrack.processStatic(YoutubeAudioTrack.java:58) at xxx.xxxxx.discord.lavaplayer.source.youtube.YoutubeAudioTrack.process(YoutubeAudioTrack.java:50) at xxx.xxxxx.discord.lavaplayer.track.DelegatedAudioTrack.processDelegate(DelegatedAudioTrack.java:25) - locked <0x00000000e7e67d48> (a com.github.topisenpai.lavasrc.spotify.SpotifyAudioTrack) at com.github.topisenpai.lavasrc.mirror.MirroringAudioTrack.process(MirroringAudioTrack.java:90) at xxx.xxxxx.discord.lavaplayer.track.playback.LocalAudioTrackExecutor.execute(LocalAudioTrackExecutor.java:104) at xxx.xxxxx.discord.lavaplayer.player.DefaultAudioPlayerManager.lambda$executeTrack$1(DefaultAudioPlayerManager.java:361) at xxx.xxxxx.discord.lavaplayer.player.DefaultAudioPlayerManager$$Lambda$325/0x00000008012e7aa0.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@17.0.7/ThreadPoolExecutor.java:1136) at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@17.0.7/ThreadPoolExecutor.java:635) at java.lang.Thread.run(java.base@17.0.7/Thread.java:833) Locked ownable synchronizers: - <0x00000000e4c7be90> (a java.util.concurrent.ThreadPoolExecutor$Worker) lava-daemon-pool-playback-1-thread-29 PRIORITY : 5 THREAD ID : 0X00007FA5600B4320 NATIVE ID : 0X16E5 NATIVE ID (DECIMAL) : 5861 STATE : RUNNABLE stackTrace: java.lang.Thread.State: RUNNABLE at xxx.xxxxx.discord.lavaplayer.natives.opus.OpusEncoderLibrary.encode(Native Method) at xxx.xxxxx.discord.lavaplayer.natives.opus.OpusEncoder.encode(OpusEncoder.java:43) at xxx.xxxxx.discord.lavaplayer.format.transcoder.OpusChunkEncoder.encode(OpusChunkEncoder.java:39) at xxx.xxxxx.discord.lavaplayer.filter.BufferingPostProcessor.process(BufferingPostProcessor.java:34) at xxx.xxxxx.discord.lavaplayer.filter.FinalPcmAudioFilter.dispatch(FinalPcmAudioFilter.java:157) at xxx.xxxxx.discord.lavaplayer.filter.FinalPcmAudioFilter.process(FinalPcmAudioFilter.java:129) at xxx.xxxxx.discord.lavaplayer.filter.AudioPipeline.process(AudioPipeline.java:33) at xxx.xxxxx.discord.lavaplayer.container.common.OpusPacketRouter.passDownstream(OpusPacketRouter.java:160) at xxx.xxxxx.discord.lavaplayer.container.common.OpusPacketRouter.process(OpusPacketRouter.java:96) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaOpusTrackConsumer.consume(MatroskaOpusTrackConsumer.java:46) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaStreamingFile.processFrameInBlock(MatroskaStreamingFile.java:371) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaStreamingFile.parseClusterSimpleBlock(MatroskaStreamingFile.java:335) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaStreamingFile.parseNextCluster(MatroskaStreamingFile.java:320) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaStreamingFile.provideFrames(MatroskaStreamingFile.java:296) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaAudioTrack.lambda$process$0(MatroskaAudioTrack.java:39) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaAudioTrack$$Lambda$345/0x00000008012fd320.performRead(Unknown Source) at xxx.xxxxx.discord.lavaplayer.track.playback.LocalAudioTrackExecutor.executeProcessingLoop(LocalAudioTrackExecutor.java:275) at xxx.xxxxx.discord.lavaplayer.track.playback.LocalAudioTrackExecutor.executeProcessingLoop(LocalAudioTrackExecutor.java:249) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaAudioTrack.process(MatroskaAudioTrack.java:38) at xxx.xxxxx.discord.lavaplayer.track.DelegatedAudioTrack.processDelegate(DelegatedAudioTrack.java:25) - locked <0x00000000e33a2ae0> (a xxx.xxxxx.discord.lavaplayer.source.youtube.YoutubeAudioTrack) at xxx.xxxxx.discord.lavaplayer.source.youtube.YoutubeAudioTrack.processStatic(YoutubeAudioTrack.java:58) at xxx.xxxxx.discord.lavaplayer.source.youtube.YoutubeAudioTrack.process(YoutubeAudioTrack.java:50) at xxx.xxxxx.discord.lavaplayer.track.DelegatedAudioTrack.processDelegate(DelegatedAudioTrack.java:25) - locked <0x00000000e3d73ab8> (a com.github.topisenpai.lavasrc.spotify.SpotifyAudioTrack) at com.github.topisenpai.lavasrc.mirror.MirroringAudioTrack.process(MirroringAudioTrack.java:90) at xxx.xxxxx.discord.lavaplayer.track.playback.LocalAudioTrackExecutor.execute(LocalAudioTrackExecutor.java:104) at xxx.xxxxx.discord.lavaplayer.player.DefaultAudioPlayerManager.lambda$executeTrack$1(DefaultAudioPlayerManager.java:361) at xxx.xxxxx.discord.lavaplayer.player.DefaultAudioPlayerManager$$Lambda$325/0x00000008012e7aa0.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@17.0.7/ThreadPoolExecutor.java:1136) at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@17.0.7/ThreadPoolExecutor.java:635) at java.lang.Thread.run(java.base@17.0.7/Thread.java:833) Locked ownable synchronizers: - <0x00000000e4734da0> (a java.util.concurrent.ThreadPoolExecutor$Worker) lava-daemon-pool-playback-1-thread-30 PRIORITY : 5 THREAD ID : 0X00007FA5500BD700 NATIVE ID : 0X16E7 NATIVE ID (DECIMAL) : 5863 STATE : RUNNABLE stackTrace: java.lang.Thread.State: RUNNABLE at xxx.xxxxx.discord.lavaplayer.natives.opus.OpusEncoderLibrary.encode(Native Method) at xxx.xxxxx.discord.lavaplayer.natives.opus.OpusEncoder.encode(OpusEncoder.java:43) at xxx.xxxxx.discord.lavaplayer.format.transcoder.OpusChunkEncoder.encode(OpusChunkEncoder.java:39) at xxx.xxxxx.discord.lavaplayer.filter.BufferingPostProcessor.process(BufferingPostProcessor.java:34) at xxx.xxxxx.discord.lavaplayer.filter.FinalPcmAudioFilter.dispatch(FinalPcmAudioFilter.java:157) at xxx.xxxxx.discord.lavaplayer.filter.FinalPcmAudioFilter.process(FinalPcmAudioFilter.java:129) at xxx.xxxxx.discord.lavaplayer.filter.AudioPipeline.process(AudioPipeline.java:33) at xxx.xxxxx.discord.lavaplayer.container.common.OpusPacketRouter.passDownstream(OpusPacketRouter.java:160) at xxx.xxxxx.discord.lavaplayer.container.common.OpusPacketRouter.process(OpusPacketRouter.java:96) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaOpusTrackConsumer.consume(MatroskaOpusTrackConsumer.java:46) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaStreamingFile.processFrameInBlock(MatroskaStreamingFile.java:371) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaStreamingFile.parseClusterSimpleBlock(MatroskaStreamingFile.java:335) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaStreamingFile.parseNextCluster(MatroskaStreamingFile.java:320) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaStreamingFile.provideFrames(MatroskaStreamingFile.java:296) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaAudioTrack.lambda$process$0(MatroskaAudioTrack.java:39) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaAudioTrack$$Lambda$345/0x00000008012fd320.performRead(Unknown Source) at xxx.xxxxx.discord.lavaplayer.track.playback.LocalAudioTrackExecutor.executeProcessingLoop(LocalAudioTrackExecutor.java:275) at xxx.xxxxx.discord.lavaplayer.track.playback.LocalAudioTrackExecutor.executeProcessingLoop(LocalAudioTrackExecutor.java:249) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaAudioTrack.process(MatroskaAudioTrack.java:38) at xxx.xxxxx.discord.lavaplayer.track.DelegatedAudioTrack.processDelegate(DelegatedAudioTrack.java:25) - locked <0x00000000e33d1338> (a xxx.xxxxx.discord.lavaplayer.source.youtube.YoutubeAudioTrack) at xxx.xxxxx.discord.lavaplayer.source.youtube.YoutubeAudioTrack.processStatic(YoutubeAudioTrack.java:58) at xxx.xxxxx.discord.lavaplayer.source.youtube.YoutubeAudioTrack.process(YoutubeAudioTrack.java:50) at xxx.xxxxx.discord.lavaplayer.track.DelegatedAudioTrack.processDelegate(DelegatedAudioTrack.java:25) - locked <0x00000000e8d17a30> (a com.github.topisenpai.lavasrc.spotify.SpotifyAudioTrack) at com.github.topisenpai.lavasrc.mirror.MirroringAudioTrack.process(MirroringAudioTrack.java:90) at xxx.xxxxx.discord.lavaplayer.track.playback.LocalAudioTrackExecutor.execute(LocalAudioTrackExecutor.java:104) at xxx.xxxxx.discord.lavaplayer.player.DefaultAudioPlayerManager.lambda$executeTrack$1(DefaultAudioPlayerManager.java:361) at xxx.xxxxx.discord.lavaplayer.player.DefaultAudioPlayerManager$$Lambda$325/0x00000008012e7aa0.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@17.0.7/ThreadPoolExecutor.java:1136) at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@17.0.7/ThreadPoolExecutor.java:635) at java.lang.Thread.run(java.base@17.0.7/Thread.java:833) Locked ownable synchronizers: - <0x00000000e474e658> (a java.util.concurrent.ThreadPoolExecutor$Worker) lava-daemon-pool-playback-1-thread-72 PRIORITY : 5 THREAD ID : 0X00007FA5413FF4A0 NATIVE ID : 0X1A10 NATIVE ID (DECIMAL) : 6672 STATE : RUNNABLE stackTrace: java.lang.Thread.State: RUNNABLE at xxx.xxxxx.discord.lavaplayer.natives.opus.OpusEncoderLibrary.encode(Native Method) at xxx.xxxxx.discord.lavaplayer.natives.opus.OpusEncoder.encode(OpusEncoder.java:43) at xxx.xxxxx.discord.lavaplayer.format.transcoder.OpusChunkEncoder.encode(OpusChunkEncoder.java:39) at xxx.xxxxx.discord.lavaplayer.filter.BufferingPostProcessor.process(BufferingPostProcessor.java:34) at xxx.xxxxx.discord.lavaplayer.filter.FinalPcmAudioFilter.dispatch(FinalPcmAudioFilter.java:157) at xxx.xxxxx.discord.lavaplayer.filter.FinalPcmAudioFilter.process(FinalPcmAudioFilter.java:129) at xxx.xxxxx.discord.lavaplayer.filter.AudioPipeline.process(AudioPipeline.java:33) at xxx.xxxxx.discord.lavaplayer.container.common.OpusPacketRouter.passDownstream(OpusPacketRouter.java:160) at xxx.xxxxx.discord.lavaplayer.container.common.OpusPacketRouter.process(OpusPacketRouter.java:96) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaOpusTrackConsumer.consume(MatroskaOpusTrackConsumer.java:46) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaStreamingFile.processFrameInBlock(MatroskaStreamingFile.java:371) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaStreamingFile.parseClusterSimpleBlock(MatroskaStreamingFile.java:335) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaStreamingFile.parseNextCluster(MatroskaStreamingFile.java:320) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaStreamingFile.provideFrames(MatroskaStreamingFile.java:296) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaAudioTrack.lambda$process$0(MatroskaAudioTrack.java:39) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaAudioTrack$$Lambda$345/0x00000008012fd320.performRead(Unknown Source) at xxx.xxxxx.discord.lavaplayer.track.playback.LocalAudioTrackExecutor.executeProcessingLoop(LocalAudioTrackExecutor.java:275) at xxx.xxxxx.discord.lavaplayer.track.playback.LocalAudioTrackExecutor.executeProcessingLoop(LocalAudioTrackExecutor.java:249) at xxx.xxxxx.discord.lavaplayer.container.matroska.MatroskaAudioTrack.process(MatroskaAudioTrack.java:38) at xxx.xxxxx.discord.lavaplayer.track.DelegatedAudioTrack.processDelegate(DelegatedAudioTrack.java:25) - locked <0x00000000e2d98588> (a xxx.xxxxx.discord.lavaplayer.source.youtube.YoutubeAudioTrack) at xxx.xxxxx.discord.lavaplayer.source.youtube.YoutubeAudioTrack.processStatic(YoutubeAudioTrack.java:58) at xxx.xxxxx.discord.lavaplayer.source.youtube.YoutubeAudioTrack.process(YoutubeAudioTrack.java:50) at xxx.xxxxx.discord.lavaplayer.track.DelegatedAudioTrack.processDelegate(DelegatedAudioTrack.java:25) - locked <0x00000000e90d9560> (a com.github.topisenpai.lavasrc.spotify.SpotifyAudioTrack) at com.github.topisenpai.lavasrc.mirror.MirroringAudioTrack.process(MirroringAudioTrack.java:90) at xxx.xxxxx.discord.lavaplayer.track.playback.LocalAudioTrackExecutor.execute(LocalAudioTrackExecutor.java:104) at xxx.xxxxx.discord.lavaplayer.player.DefaultAudioPlayerManager.lambda$executeTrack$1(DefaultAudioPlayerManager.java:361) at xxx.xxxxx.discord.lavaplayer.player.DefaultAudioPlayerManager$$Lambda$325/0x00000008012e7aa0.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@17.0.7/ThreadPoolExecutor.java:1136) at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@17.0.7/ThreadPoolExecutor.java:635) at java.lang.Thread.run(java.base@17.0.7/Thread.java:833) Locked ownable synchronizers: - <0x00000000e38fb590> (a java.util.concurrent.ThreadPoolExecutor$Worker)
Edit your Comment