项目场景:
项目场景:编写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次验证:在开始接口重新创建指针对象,在结束接口手动释放指针对象,程序稳定运行,验证成功。
解决方案:
在开始接口重新创建指针对象,在结束接口手动释放指针对象。
解决方案描述:对读卡器操作会有一个完整流程,每次都需要先打开读卡器、获取读卡器编号、寻卡、(具体操作接口)、关闭读卡器,在一个完整流程内,要确保指针对象不会改变,结束后立即手动释放,否则可能会出现内存访问异常。
总结:
过程是曲折的 ,结局是美好的,加油!
如果遇到相似的问题,欢迎留言交流。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/114738.html