1)jps拿到进程号
2)jstack <pid> > <xxx.txt> // jstack作用:分析线程信息,死循环,死锁
jstack 23647 > 23647.txt
Found 1 deadlock
3)对比:arthas查看线程信息
[arthas@68751]$ thread -n 10
"MainWorker" Id=69 cpuUsage=72.29% deltaTime=156ms time=91183068ms WAITING
at app//com.elex.billion.icefire.game.biz.service.impl.robot.RobotServiceImpl.lambda$testFightTroop$0(RobotServiceImpl.java:493)
at app//com.elex.billion.icefire.game.biz.service.impl.robot.RobotServiceImpl$$Lambda$979/0x000000080111f440.test(Unknown Source)
at app//com.elex.icefire.scene.object.AbstractSceneObjectCellContainer.lambda$findObjects$4(AbstractSceneObjectCellContainer.java:342)
at app//com.elex.icefire.scene.object.AbstractSceneObjectCellContainer$$Lambda$980/0x000000080111ec40.accept(Unknown Source)
at java.base@11.0.16.1/java.util.concurrent.ConcurrentHashMap$ValuesView.forEach(ConcurrentHashMap.java:4772)
at java.base@11.0.16.1/java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1085)
at app//com.elex.icefire.scene.object.SceneObjectContainer.forEach(SceneObjectContainer.java:183)
at app//com.elex.icefire.scene.object.AbstractSceneObjectCellContainer.lambda$forEachObjectInRect$0(AbstractSceneObjectCellContainer.java:171)
at app//com.elex.icefire.scene.object.AbstractSceneObjectCellContainer$$Lambda$981/0x000000080111e040.accept(Unknown Source)
at app//com.elex.icefire.scene.object.AbstractSceneObjectCellContainer.forEachCellInRect(AbstractSceneObjectCellContainer.java:122)
at app//com.elex.icefire.scene.object.AbstractSceneObjectCellContainer.forEachCellInRect(AbstractSceneObjectCellContainer.java:157)
at app//com.elex.icefire.scene.object.AbstractSceneObjectCellContainer.forEachObjectInRect(AbstractSceneObjectCellContainer.java:171)
at app//com.elex.icefire.scene.object.AbstractSceneObjectCellContainer.forEachObjectInBoundingBox(AbstractSceneObjectCellContainer.java:188)
at app//com.elex.icefire.scene.object.AbstractSceneObjectCellContainer.findObjects(AbstractSceneObjectCellContainer.java:341)
at app//com.elex.icefire.scene.object.AbstractSceneObjectCellContainer.findObjects(AbstractSceneObjectCellContainer.java:323)
at app//com.elex.billion.icefire.game.biz.service.impl.robot.RobotServiceImpl.testFightTroop(RobotServiceImpl.java:493)
at app//com.elex.billion.icefire.game.biz.service.impl.robot.instance.FightNpcInstance.onInstanceTick(FightNpcInstance.java:162)
at app//com.elex.billion.icefire.game.biz.service.impl.robot.RobotServiceImpl.playerForcedLowTick(RobotServiceImpl.java:133)
at app//com.elex.billion.icefire.game.biz.service.flow.LogicServiceManager.playerForcedLowTick(LogicServiceManager.java:268)
at app//com.elex.billion.icefire.game.biz.service.impl.player.PlayerTickHandler.tick(PlayerTickHandler.java:39)
at app//com.elex.billion.icefire.game.biz.service.impl.player.PlayerTickHandler.tick(PlayerTickHandler.java:14)
at app//com.elex.billion.icefire.game.biz.common.AbstractTickerUnitManager.tick(AbstractTickerUnitManager.java:97)
at app//com.elex.billion.icefire.game.biz.model.world.World.tick(World.java:190)
at app//com.elex.billion.icefire.game.biz.exec.MainTask.run(MainTask.java:83)
at app//com.elex.billion.icefire.game.biz.exec.MainWorker.execute(MainWorker.java:55)
at app//com.elex.framework.core.thread.SingleThreadTaskWorker.run(SingleThreadTaskWorker.java:158)
at app//com.elex.framework.core.thread.NamedRunnable.run(NamedRunnable.java:65)
at java.base@11.0.16.1/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base@11.0.16.1/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base@11.0.16.1/java.lang.Thread.run(Thread.java:834)
"AsyncOperationServiceImpl-thread-26" Id=198 cpuUsage=51.81% deltaTime=112ms time=405798ms RUNNABLE
at java.base@11.0.16.1/java.net.SocketInputStream.socketRead0(Native Method)
at java.base@11.0.16.1/java.net.SocketInputStream.socketRead(SocketInputStream.java:115)
at java.base@11.0.16.1/java.net.SocketInputStream.read(SocketInputStream.java:168)
at java.base@11.0.16.1/java.net.SocketInputStream.read(SocketInputStream.java:140)
at app//com.mongodb.internal.connection.SocketStream.read(SocketStream.java:109)
at app//com.mongodb.internal.connection.SocketStream.read(SocketStream.java:131)
at app//com.mongodb.internal.connection.InternalStreamConnection.receiveResponseBuffers(InternalStreamConnection.java:648)
at app//com.mongodb.internal.connection.InternalStreamConnection.receiveMessageWithAdditionalTimeout(InternalStreamConnection.java:513)
at app//com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:356)
at app//com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:280)
at app//com.mongodb.internal.connection.UsageTrackingInternalConnection.sendAndReceive(UsageTrackingInternalConnection.java:100)
at app//com.mongodb.internal.connection.DefaultConnectionPool$PooledConnection.sendAndReceive(DefaultConnectionPool.java:490)
at app//com.mongodb.internal.connection.CommandProtocolImpl.execute(CommandProtocolImpl.java:71)
at app//com.mongodb.internal.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:255)
at app//com.mongodb.internal.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:202)
at app//com.mongodb.internal.connection.DefaultServerConnection.command(DefaultServerConnection.java:118)
at app//com.mongodb.internal.operation.MixedBulkWriteOperation.executeCommand(MixedBulkWriteOperation.java:431)
at app//com.mongodb.internal.operation.MixedBulkWriteOperation.executeBulkWriteBatch(MixedBulkWriteOperation.java:251)
at app//com.mongodb.internal.operation.MixedBulkWriteOperation.access$700(MixedBulkWriteOperation.java:76)
at app//com.mongodb.internal.operation.MixedBulkWriteOperation$1.call(MixedBulkWriteOperation.java:194)
at app//com.mongodb.internal.operation.MixedBulkWriteOperation$1.call(MixedBulkWriteOperation.java:185)
at app//com.mongodb.internal.operation.OperationHelper.withReleasableConnection(OperationHelper.java:620)
at app//com.mongodb.internal.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:185)
at app//com.mongodb.internal.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:76)
at app//com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.execute(MongoClientDelegate.java:195)
at app//com.mongodb.client.internal.MongoCollectionImpl.executeSingleWriteRequest(MongoCollectionImpl.java:1009)
at app//com.mongodb.client.internal.MongoCollectionImpl.executeUpdate(MongoCollectionImpl.java:993)
at app//com.mongodb.client.internal.MongoCollectionImpl.updateOne(MongoCollectionImpl.java:578)
at app//com.elex.billion.icefire.game.biz.service.impl.db.DBService.doUpdateOneEntity(DBService.java:252)
at app//com.elex.billion.icefire.game.biz.service.impl.db.DBAsyncSave.saveDB(DBAsyncSave.java:127)
at app//com.elex.billion.icefire.game.biz.service.impl.db.DBAsyncSave.run(DBAsyncSave.java:108)
at app//com.elex.billion.icefire.game.biz.service.impl.AsyncOperationServiceImpl.internalAsyncRunner(AsyncOperationServiceImpl.java:128)
at app//com.elex.billion.icefire.game.biz.service.impl.AsyncOperationServiceImpl.lambda$execute$0(AsyncOperationServiceImpl.java:84)
at app//com.elex.billion.icefire.game.biz.service.impl.AsyncOperationServiceImpl$$Lambda$599/0x0000000800cfac40.run(Unknown Source)
at java.base@11.0.16.1/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base@11.0.16.1/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base@11.0.16.1/java.lang.Thread.run(Thread.java:834)
"So-Worker-BigWorld-t8" Id=236 cpuUsage=43.67% deltaTime=94ms time=21315607ms WAITING on java.util.concurrent.locks.ReentrantLock$NonfairSync@213dd41d
at java.base@11.0.16.1/jdk.internal.misc.Unsafe.park(Native Method)
- waiting on java.util.concurrent.locks.ReentrantLock$NonfairSync@213dd41d
at java.base@11.0.16.1/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
at java.base@11.0.16.1/java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:885)
at java.base@11.0.16.1/java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:917)
at java.base@11.0.16.1/java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1240)
at java.base@11.0.16.1/java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:267)
at app//ch.qos.logback.core.OutputStreamAppender.writeBytes(OutputStreamAppender.java:200)
at app//ch.qos.logback.core.OutputStreamAppender.writeOut(OutputStreamAppender.java:193)
at app//ch.qos.logback.core.OutputStreamAppender.subAppend(OutputStreamAppender.java:228)
at app//ch.qos.logback.core.OutputStreamAppender.append(OutputStreamAppender.java:102)
at app//ch.qos.logback.core.UnsynchronizedAppenderBase.doAppend(UnsynchronizedAppenderBase.java:85)
at app//ch.qos.logback.core.spi.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:51)
at app//ch.qos.logback.classic.Logger.appendLoopOnAppenders(Logger.java:272)
at app//ch.qos.logback.classic.Logger.callAppenders(Logger.java:259)
at app//ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:426)
at app//ch.qos.logback.classic.Logger.filterAndLog_0_Or3Plus(Logger.java:386)
at app//ch.qos.logback.classic.Logger.info(Logger.java:596)
at app//com.elex.service.conf.model.fight.GameFormula.baseAttack(GameFormula.java:224)
at app//com.elex.service.conf.model.fight.GameFormula.attack(GameFormula.java:242)
at app//com.elex.icefire.scene.object.model.skill.effect.SSE_Hurt.castToTarget(SSE_Hurt.java:99)
at app//com.elex.icefire.scene.object.model.skill.effect.SSE_Hurt.castTo(SSE_Hurt.java:53)
at app//com.elex.icefire.scene.object.model.skill.effect.AbstractSceneSkillEffect.castTo(AbstractSceneSkillEffect.java:272)
at app//com.elex.icefire.scene.object.model.skill.SceneNormalAttackSkill.attack(SceneNormalAttackSkill.java:44)
at app//com.elex.icefire.scene.object.model.SceneBattle.normalAttack(SceneBattle.java:681)
at app//com.elex.icefire.scene.object.model.SceneBattle.action1(SceneBattle.java:596)
at app//com.elex.icefire.scene.object.model.SceneBattle.updateAction(SceneBattle.java:497)
at app//com.elex.icefire.scene.ticker.SOT_Battle.lambda$updateObjects$4(SOT_Battle.java:82)
at app//com.elex.icefire.scene.ticker.SOT_Battle$$Lambda$998/0x000000080115dc40.accept(Unknown Source)
at java.base@11.0.16.1/java.lang.Iterable.forEach(Iterable.java:75)
at app//com.elex.billion.icefire.core.thread.ThreadUtils.listObjectAction(ThreadUtils.java:79)
at app//com.elex.billion.icefire.core.thread.ThreadUtils.lambda$forEach$3(ThreadUtils.java:55)
at app//com.elex.billion.icefire.core.thread.ThreadUtils$$Lambda$902/0x0000000800fb3c40.run(Unknown Source)
at java.base@11.0.16.1/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1736)
at java.base@11.0.16.1/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base@11.0.16.1/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base@11.0.16.1/java.lang.Thread.run(Thread.java:834)
"So-Worker-BigWorld-t4" Id=232 cpuUsage=34.88% deltaTime=75ms time=21301342ms WAITING on java.util.concurrent.locks.ReentrantLock$NonfairSync@213dd41d
at java.base@11.0.16.1/jdk.internal.misc.Unsafe.park(Native Method)
- waiting on java.util.concurrent.locks.ReentrantLock$NonfairSync@213dd41d
at java.base@11.0.16.1/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
at java.base@11.0.16.1/java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:885)
at java.base@11.0.16.1/java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:917)
at java.base@11.0.16.1/java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1240)
at java.base@11.0.16.1/java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:267)
at app//ch.qos.logback.core.OutputStreamAppender.writeBytes(OutputStreamAppender.java:200)
at app//ch.qos.logback.core.OutputStreamAppender.writeOut(OutputStreamAppender.java:193)
at app//ch.qos.logback.core.OutputStreamAppender.subAppend(OutputStreamAppender.java:228)
at app//ch.qos.logback.core.OutputStreamAppender.append(OutputStreamAppender.java:102)
at app//ch.qos.logback.core.UnsynchronizedAppenderBase.doAppend(UnsynchronizedAppenderBase.java:85)
at app//ch.qos.logback.core.spi.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:51)
at app//ch.qos.logback.classic.Logger.appendLoopOnAppenders(Logger.java:272)
at app//ch.qos.logback.classic.Logger.callAppenders(Logger.java:259)
at app//ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:426)
at app//ch.qos.logback.classic.Logger.filterAndLog_0_Or3Plus(Logger.java:386)
at app//ch.qos.logback.classic.Logger.info(Logger.java:596)
at app//com.elex.service.conf.model.fight.GameFormula.attack(GameFormula.java:269)
at app//com.elex.icefire.scene.object.model.skill.effect.SSE_Hurt.castToTarget(SSE_Hurt.java:99)
at app//com.elex.icefire.scene.object.model.skill.effect.SSE_Hurt.castTo(SSE_Hurt.java:53)
at app//com.elex.icefire.scene.object.model.skill.effect.AbstractSceneSkillEffect.castTo(AbstractSceneSkillEffect.java:272)
at app//com.elex.icefire.scene.object.model.skill.SceneNormalAttackSkill.attack(SceneNormalAttackSkill.java:44)
at app//com.elex.icefire.scene.object.model.SceneBattle.normalAttack(SceneBattle.java:681)
at app//com.elex.icefire.scene.object.model.SceneBattle.action1(SceneBattle.java:596)
at app//com.elex.icefire.scene.object.model.SceneBattle.updateAction(SceneBattle.java:497)
at app//com.elex.icefire.scene.ticker.SOT_Battle.lambda$updateObjects$4(SOT_Battle.java:82)
at app//com.elex.icefire.scene.ticker.SOT_Battle$$Lambda$998/0x000000080115dc40.accept(Unknown Source)
at java.base@11.0.16.1/java.lang.Iterable.forEach(Iterable.java:75)
at app//com.elex.billion.icefire.core.thread.ThreadUtils.listObjectAction(ThreadUtils.java:79)
at app//com.elex.billion.icefire.core.thread.ThreadUtils.lambda$forEach$3(ThreadUtils.java:55)
at app//com.elex.billion.icefire.core.thread.ThreadUtils$$Lambda$902/0x0000000800fb3c40.run(Unknown Source)
at java.base@11.0.16.1/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1736)
at java.base@11.0.16.1/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base@11.0.16.1/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base@11.0.16.1/java.lang.Thread.run(Thread.java:834)
4)jvm命令快速查看是否有死锁
可以看出来,我主要想看下是否有死锁情况,此时我用arthas的jvm命令看的会更加清楚:
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
THREAD
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
COUNT 277
DAEMON-COUNT 108
PEAK-COUNT 279
STARTED-COUNT 474
DEADLOCK-COUNT 0 // 所以暂时是没有死锁的