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

导读:本篇文章讲解 Java程序崩溃 A fatal error has been detected by the Java Runtime Environment (0xc0000005)(0xC0000374),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

项目场景:

项目场景:编写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

(0)
Java光头强的头像Java光头强

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!