#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00000001800156c4, pid=1376, tid=0x0000000000002b40
#
# JRE version: OpenJDK Runtime Environment (8.0_242-b08) (build 1.8.0_242-b08)
# Java VM: OpenJDK 64-Bit Server VM (25.242-b08 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C [sigar-amd64-winnt.dll+0x156c4]
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# If you would like to submit a bug report, please visit:
#
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
--------------- T H R E A D ---------------
Current thread (0x0000017a90c2e000): JavaThread "agent-host-metrics-poller" daemon [_thread_in_native, id=11072, stack(0x0000004916f00000,0x0000004917000000)]
siginfo: ExceptionCode=0xc0000005, reading address 0xffffffff92c80d90
Registers:
RAX=0xffffffff92c80c40, RBX=0x0000017a93310c50, RCX=0x0000017a90c2e1e0, RDX=0x0000004916ffec58
RSP=0x0000004916ffeae0, RBP=0x0000004916ffec38, RSI=0x0000000000200021, RDI=0x00000000000004ab
R8 =0x0000000000000032, R9 =0x00000000f3657458, R10=0x00000000000002a8, R11=0x000000006aa0ecf4
R12=0x0000000000000000, R13=0x0000017a93310c48, R14=0x0000004916ffec60, R15=0x00000
17a90c2e000
大概就是这样的错把。
我的场景是这样的,我们是做的一个压力测试项目,网上拉取了一个Ngrider开源项目,然后整合了一下,我们自己开发性能测试系统, 有个 代理服务安装程序 ,点击下载,下载后是一个tar格式的压缩包看下面图:
看里面的文件:
大概是这样的,我刚来公司的第一天,经理丢给了我这个任务,让我去解决,我一头雾水,说是我们这边开发完了,然后丢给客户使用的时候,说报错,点击bat启动直接闪退,还打了log日志文件,可能是java版本导致的。我可以说,整个csdn、博客园、github看遍了最后找到了问题所在, 接下来贴上我自己的解错流程:
1.首先排除堆、jdk、tomcat大小内存问题,错误日志中显示内存足够,点击后缀名是bat的文件启动的时候,闪退,会生成一个文件,
log文件,其中有一个heap开头的,是堆的意思,看下是否内存问题。
2.Failed to write core dump. Minidumps are not enabled by default on client versions of Windows,
无法写入核心转储。默认情况下,在客户端版本的Windows上不启用小型转储,自己可以在百度上看看这个文件如何打开,或者如何创建,问题排除,已开启。
3.IDEA所有的子项目编译全部改为1.8
4.tomcat换成8代
5.在tomcat的配置文件中更改指定的jre
6.Problematic frame:C [sigar-amd64-winnt.dll+0x14ed4],sigar-amd64-winnt.dll+0x14edll文件,JDK1.8.0_131 到 1.8.0_241 都没问题,
jdk官方和sigar就这个问题讨论过,并不是jdk的bug,只是代码责任边界的问题,请使用1.8.0_101,不要使用1.8.0_261之后的版本
7.下载sigar-amd64-winnt.dll+0x14edll文件,放到jdk的bin目录下 无效
8.将sigar-amd64-winnt.dll+0x14edll放在C:\Windows\System32目录下 无效
9.报这个sigar-amd64-winnt.dll+0x14edll错的代表sigar4.1版本不匹配,自行网上下载替换。
大概是以上了,相信如果有同样错误的老哥们,肯定也发现了,1.8.0_241之前都是可以使用的,网上给的方案也是说明白了,让你换版本,但是客户那边就一直说,为啥要换,不能找方法解决吗?
最后的正解,地址:https://github.com/hyperic/sigar/issues/141,英语不行的可直接翻译,在最下面可以看到
,点击下载,下载完后,你需要看一下,右键属性查看版本信息,如果是比你目前的版本低一个版本,我好像记得是6.4.0的把,我也忘了,我们之前勇的是6.4.1的好像,就是低了一个版本,我也不清楚这个老外是否把这个dll重构了,我不知道我说的各位老哥是否能看懂,如果能看懂的老哥,到这里也就知道怎么做了,把这个dll文件重新覆盖之前的dll文件,应该是在Ngrider文件下还是哪里,我忘记了,老哥们可以找一下,好像是需要把dll文件注册到windows中,或许不需要,直接替换直接启动试一下,时间久了忘记了。还有一个问题,就是比如说你打包了项目后,你是使用的jdk8打包的,然后上传了,部署了,然后你点击下载到本地一个一个tar包,你点击bat启动,此时你的jdk版本是11都可以启动(狗头)。大概就是这些了,如果有问题可以一起探讨