Java程序崩溃 A fatal error has been detected by the Java Runtime Environment (0xc0000005)(0xC0000374)

项目场景:

项目场景:编写Java程序,通过JNA调用C语言开发的DLL,控制读卡器进行读卡、写卡、充值等操作。

遇到的问题:Java程序频繁出现异常崩溃,这里进行记录以供参考。


问题描述

程序操作读卡器的过程中,会频繁出现程序异常终止,
以下为程序终止后控制台输出的代码:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x77bcd850, pid=17088, tid=0x00006fd8
#
# JRE version: Java(TM) SE Runtime Environment (8.0_151-b12) (build 1.8.0_151-b12)
# Java VM: Java HotSpot(TM) Client VM (25.151-b12 mixed mode windows-x86 )
# Problematic frame:
# C  [ntdll.dll+0x3d850]Disconnected from the target VM, address: '127.0.0.1:50148', transport: 'socket'

Process finished with exit code -1073740940 (0xC0000374)

 以下为百度翻译,仅供参考,大佬可直接跳过。

#Java运行时环境检测到致命错误

#出现异常访问违规(0xc0000005)


#JRE版本:Java(TM)SE运行时环境(8.0_151-b12)(build 1.8.0_151-b12)

#Java虚拟机:Java热点(TM)客户端虚拟机(25.151-b12混合模式windows-x86)

#有问题的框架:

#C[ntdll.dll+0x3d850]已断开与目标VM的连接,地址:'127.0.0.1:50148',传输:'socket'


流程结束,退出代码为1073740940(0xC0000374)

原因分析:

第一次分析:因为Java有异常捕捉机制,大部分异常都可以进行捕捉输出,但是程序崩溃大都是出现在调用Dll程序过程,没有进行响应就直接崩溃,初步怀疑是内存的问题:

第一次验证:在所有调用DLL方法前后增加日志输出,调用前日志输出正常,调用后日志未输出,导致程序崩溃,因此可以定位到是Dll内部导致内存出现问题并崩溃

第n次分析:。。。(一次次头疼)

第n次验证:。。。(一次次头大)

第n+1次分析:首先所有接口调用都有成功过,排除参数类型;其次完整流程也有走通过且程序没有崩溃,排除DLL业务逻辑有问题,最后想到会不会是我这边Java创建的指针对象被C操作,或者各种原因被GC(垃圾回收)操作了,导致内存违规访问

第n+1次验证:在开始接口重新创建指针对象,在结束接口手动释放指针对象,程序稳定运行,验证成功。


解决方案:

在开始接口重新创建指针对象,在结束接口手动释放指针对象。

解决方案描述:对读卡器操作会有一个完整流程,每次都需要先打开读卡器、获取读卡器编号、寻卡、(具体操作接口)、关闭读卡器,在一个完整流程内,要确保指针对象不会改变,结束后立即手动释放,否则可能会出现内存访问异常。


总结:

过程是曲折的 ,结局是美好的,加油!

如果遇到相似的问题,欢迎留言交流。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是有多懒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值