当前位置: 首页 > news >正文

一次死锁的排查

目录

问题

解决方法

System.exit(1)

Runtime.getRuntime().halt(1)


问题

动作: 变更了服务器的ip,然后进行更换IP 的动作;服务器重启后,再也启动不来了。

发现进行还在,根据进程号 netstat -ano|findstr pid 可以看到一些6643等服务还在。8970可能不在了。

jconsole pid 发现了其中有死锁。

观察日志 error.log发现 地址变更后,mqtt 已经在做connectlost里处理进行重连了!但这个时候它不断占用锁;但spring-boot销毁bean的程序已经也要占用锁。所以死锁了

但ip又不能写127,因为前端会使用这个ip.


Found one Java-level deadlock:
=============================
"Thread-34":waiting to lock monitor 0x000000001faa28e8 (object 0x00000000854258c0, a org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter),which is held by "MQTT Con: 123456-inbound"
"MQTT Con: 123456-inbound":waiting for ownable synchronizer 0x0000000085425c58, (a java.util.concurrent.locks.ReentrantLock$NonfairSync),which is held by "Thread-34"Java stack information for the threads listed above:
===================================================
"Thread-34":at org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter.doStop(MqttPahoMessageDrivenChannelAdapter.java:178)- waiting to lock <0x00000000854258c0> (a org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter)at org.springframework.integration.endpoint.AbstractEndpoint.stop(AbstractEndpoint.java:173)at com.gbcom.wvp.util.ServerIPCheck$1.run(ServerIPCheck.java:135)at java.lang.Thread.run(Thread.java:748)
"MQTT Con: 123456-inbound":at sun.misc.Unsafe.park(Native Method)- parking to wait for  <0x0000000085425c58> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:870)at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1199)at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:209)at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:285)at org.springframework.integration.endpoint.AbstractEndpoint.isRunning(AbstractEndpoint.java:142)at org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter.connectionLost(MqttPahoMessageDrivenChannelAdapter.java:346)- locked <0x00000000854258c0> (a org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter)at org.eclipse.paho.client.mqttv3.internal.CommsCallback.connectionLost(CommsCallback.java:304)at org.eclipse.paho.client.mqttv3.internal.ClientComms.shutdownConnection(ClientComms.java:439)at org.eclipse.paho.client.mqttv3.internal.ClientComms$ConnectBG.run(ClientComms.java:740)at java.lang.Thread.run(Thread.java:748)Found 1 deadlock.

解决方法

直接把原来比较优雅的销毁,变成粗暴的销毁,还可以加快速度 。

我将原来的System.exit(1)替换为Runtime.getRuntime().halt(1),这两种方法的区别在于:

System.exit(1)

  • 触发正常的JVM关闭序列
  • 调用所有已注册的关闭钩子(包括Spring的上下文关闭过程)
  • 等待所有Bean的销毁方法执行完毕
  • 这可能导致死锁,正如你在MQTT适配器中遇到的问题

Runtime.getRuntime().halt(1)

  • 强制终止JVM,不执行任何清理操作
  • 立即停止所有线程(除了调用halt的线程)
  • 不触发关闭钩子
  • 不等待Bean销毁或其他清理操作
  • 直接终止程序,操作系统回收所有资源

http://www.xdnf.cn/news/1459153.html

相关文章:

  • 激活函数:神经网络的“灵魂开关”
  • 阅读论文神奇Zotero下载安装教程以及划词翻译(Translate for Zotero)的配置
  • 动态内存管理柔性数组
  • Vue 中绑定样式的几种方式
  • Process Explorer 学习笔记(第三章3.1.1):度量 CPU 的使用情况详解
  • 【Unity知识分享】Unity接入dll调用Window系统接口
  • 无限时长视频生成新突破!复旦联合微软、腾讯混元推出StableAvatar,仅需1张照片+1段音频实现真人说话视频
  • hutool的EnumUtil工具类实践【持续更新】
  • 揭秘23种设计模式的艺术与技巧之行为型
  • 美联储计划召开稳定币和代币化创新会议
  • 大数据框架Doris全面解析
  • 期权平仓后权利金去哪了?
  • 基于STM32的智能家居语音控制系统设计
  • Pycharm终端pip install的包都在C:\Users\\AppData\Roaming\Python\解决办法
  • 手写Spring框架
  • 前端跨域终极指南:3 种优雅解决方案 + 可运行 Demo
  • 解密注意力机制:为何它能在Transformer中实现高效并行计算?
  • STM32G4 速度环开环,电流环闭环 IF模式建模
  • 如何在Linux上部署1Panel面板并远程访问内网Web端管理界面
  • Kafka 开启 SASL_PLAINTEXT 双监听器认证(内网/外网)
  • 如何减少文档冗余和重复劳动
  • vite_react 插件 find_code 最终版本
  • MVCC是如何工作的?
  • bash自带的切片操作
  • 解锁“桐果云”的全链路能力矩阵,技术人必看的企业级数据应用方案
  • 阿里云轻量应用服务器部署WordPress与配置SSL 证书
  • 英飞凌ASIL-D级无刷电机驱动芯片TLE9189守护汽车安全
  • 第三方网站测试:WEB安全测试中DOM型XSS漏洞的检测
  • [Windows] PDF工具箱 PDF24 Creator 11.28.0
  • 为什么ApiFox的分页查询的返回Vo的数据没有全部展示? 只展示了返回有数据的?没有数据的为什么不展示?