Java 退出前卸载dll rxtx以避免jvm崩溃或隐藏hs_err_pid.log文件
嗯,我在一个使用rxtxSerial.dll的项目上(顺便说一句,这个问题非常严重) 无论如何,我对GUI做了一个修改,使其更加友好,最初程序会显示主窗口,并且可以打开一些其他框架,用户可以在其中监视我工作的公司设计的某些设备。因此,当用户想要关闭hole程序和任何打开的窗口时,会出现一个对话框,要求用户自己关闭打开的窗口,然后关闭程序,这真的很难看,所以我想:让我们做得更好;这就是我所做的: 当使用串行通信的Java 退出前卸载dll rxtx以避免jvm崩溃或隐藏hs_err_pid.log文件,java,dll,native,rxtx,jvm-crash,Java,Dll,Native,Rxtx,Jvm Crash,嗯,我在一个使用rxtxSerial.dll的项目上(顺便说一句,这个问题非常严重) 无论如何,我对GUI做了一个修改,使其更加友好,最初程序会显示主窗口,并且可以打开一些其他框架,用户可以在其中监视我工作的公司设计的某些设备。因此,当用户想要关闭hole程序和任何打开的窗口时,会出现一个对话框,要求用户自己关闭打开的窗口,然后关闭程序,这真的很难看,所以我想:让我们做得更好;这就是我所做的: 当使用串行通信的JDialogs被打开时,如果用户提示关闭程序,而不是退出前,我只保存一个引用供将来使
JDialog
s被打开时,如果用户提示关闭程序,而不是退出前,我只保存一个引用供将来使用,程序将执行以下代码,以确保调用相应的侦听器,就像停止从串行端口读取一样:
for (Window w : openedWindows)
{
w.getToolkit().getSystemEventQueue().postEvent(
new WindowEvent(w, WindowEvent.WINDOW_CLOSING));
}
当用户关闭对话框时,程序不会崩溃,因此负责关闭通信的WindowListener
s上没有问题,有时在打开联机窗口时提示关闭时程序会崩溃(在串行通信方面),实际上,崩溃本身对于用户来说是不可见的(只要他查看程序文件夹hs_err_pid.log文件),并且大约有20%的崩溃是通过在线窗口关闭的。hs_err中的崩溃类似于:siginfo:ExceptionCode=0xc000005,写入地址0x17adfa88
,因此我认为发生的情况是dll试图在java的内存已经关闭后写入,因此jvm崩溃(如果我错了,请纠正我)
我想要的是一种不生成这些错误日志文件的方法,它可以用来修复问题,或者只是一种隐藏这些文件的方法,如果可能的话,我认为答案是否定的
我认为可能的修复方法之一是在关闭jvm之前强制卸载dll,或者“请求”卸载dll并等待卸载
有什么想法吗
提前感谢。解决了我从rxtx迁移到jSSC的问题: 现在一切都很顺利!将DLL集成到.jar中,用于Windows、linux、mac和solaris,并具有系统自动检测功能 帮我省了很多工作
仍然没有这些崩溃的明确原因。请检查此项,谢谢@KonstantinV.Salikhov,但我已经看了一下,无法提取任何有用的内容。如果您有一个有缺陷的DLL或共享库,则可能值得在单独的JVM中运行它。通过这种方式,带有DLL的进程可以根据需要重新启动,对主程序的影响最小。@KonstantinV.Salikhov实际上,现在我再次寻找它,我以前没有注意到链接,我正在阅读这些链接,也许我从中得到了一些信息。但问题是,即使我能让GC收集库,我怎么知道它是否已经卸载?@PeterLawrey,这不是主要问题,我可以让它在正常程序执行时正常工作,问题只是程序关闭时有时生成的日志文件。程序操作本身没有问题。此库是否有可用的示例代码或文档?