My Life My Dream!

守信 求实 好学 力行
随笔 - 193, 文章 - 0, 评论 - 55, 阅读 - 34万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

一个使用kafka的Java项目,在Windows环境启动后不久出现进程崩溃的情况,反复验证偶发的能得到hs_err_pid.log致命错误日志,始终没有生成coredump。

通过错误日志确实看到了导致崩溃的线程堆栈跟kafka客户端有关,但栈顶显示当前在执行native本地代码,我们分别替换了kafka-clients的历史版本,问题依然存在。

查询了一下winncap364.dll文件:C:\Windows\System32\winncap364.dll,更新时间是2024-07-12,抱着侥幸心理从网上下载了一个该文件的历史版本并替换验证,jvm进程崩溃的问题消失了。

 

image

hs_err_pid.log文件包含信息如下:

  • 崩溃事件简要分析
  • 崩溃时刻正在运行的线程
  • jvm里面的所有线程
  • 内存的使用情况
  • GC日志
  • JVM内存映射
  • jvm参数
  • 服务器信息

栈帧的类型包括:

  • C: 本地 C 帧
  • j:  解释的 Java 帧
  • V: 虚拟机帧
  • v: 虚拟机生成的存根栈帧
  • J:  其他帧类型,包括编译后的 Java 帧

线程类型包括:

  • JavaThread   java线程 代表正在执行java代码
  • VMThread    JVM线程
  • CompilerThread  用来调用JITing,实时编译装卸class 。 通常,jvm会启动多个线程来处理这部分工作,线程名称后面的数字也会累加,例如:CompilerThread1
  • GCTaskThread  GC线程
  • WatcherThread  JVM 周期性任务调度的线程,是一个单例对象
  • ConcurrentMarkSweepThread 表示一个并行GC的线程

线程状态说明:

  • _thread_uninitialized:线程还没有创建,它只在内存原因崩溃的时候才出现
  • _thread_new:线程已经被创建,但是还没有启动
  • _thread_in_native:线程正在执行本地代码,一般这种情况很可能是本地代码有问题
  • _thread_in_vm:线程正在执行虚拟机代码
  • _thread_in_Java:线程正在执行解释或者编译后的 Java 代码
  • _thread_blocked:线程处于阻塞状态
  • …_trans:以_trans 结尾,线程正处于要切换到其它状态的中间状态

 

搜索winncap364.dll文件时,在网上也看到其他软件反馈该dll的类似兼容性问题:

https://blog.csdn.net/BOXonline1396529/article/details/133926665

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示