【发布时间】:2012-10-02 11:53:33
【问题描述】:
嗯,我在一个使用 rxtxSerial.dll 的项目中(顺便说一句,问题很大)。
无论如何,我对 GUI 进行了修改以使其更加用户友好,最初程序会显示主窗口,并且可以打开其他一些框架,用户可以在其中监视我工作的公司设计的某些设备.所以当用户想要关闭hole程序和openend的任何窗口时,它会出现一个对话框,要求用户自己关闭打开的窗口,然后关闭程序,这真的很难看,所以我想:让我们让它变得更好;这就是我所做的:
当打开使用串行通信的JDialogs 时,如果用户提示关闭程序而不是退出之前,我只是保存它的引用以供将来使用,程序执行以下代码以确保调用相应的侦听器比如停止从串口读取:
for (Window w : openedWindows)
{
w.getToolkit().getSystemEventQueue().postEvent(
new WindowEvent(w, WindowEvent.WINDOW_CLOSING));
}
当用户关闭对话框时程序不会崩溃,因此负责关闭通信的WindowListeners 上没有问题,有时在打开在线窗口时提示关闭时会崩溃(在串行通信方面),实际上用户看不到崩溃本身(只要他查看程序的文件夹 hs_err_pid.log 文件)并且发生大约 20% 的在线窗口关闭。 hs_err 中的崩溃就像:siginfo: ExceptionCode=0xc0000005, writing address 0x17adfa88 所以我想它发生的是 dll 在它已经关闭后试图写入 java 的内存,所以 jvm 崩溃(如果我错了,请纠正我)。
我想要的是一种不生成那些错误日志文件的方法,它可以用来解决问题或者只是一种隐藏这些文件的方法,如果可能的话,我认为答案不是。
我认为可能的修复方法之一是在关闭 jvm 本身之前强制卸载 dll 或“请求”卸载 dll 并等到它被卸载。
有什么想法吗?
提前致谢。
【问题讨论】:
-
谢谢@KonstantinV.Salikhov,但我已经看过了,无法提取任何有用的东西。
-
如果您的 DLL 或共享库有问题,可能值得在单独的 JVM 中运行它。这样,可以根据需要重新启动带有 DLL 的进程,而对主程序的影响最小。
-
@KonstantinV.Salikhov 实际上,现在我再次寻找它,我之前没有注意到链接,我正在阅读那些也许我得到了一些东西。但问题是,即使我可以要求 GC 收集库,我怎么知道它是否已经被卸载?
-
@PeterLawrey,这不是主要问题,我可以在正常程序执行时让它工作得很好,问题只是有时在程序关闭时生成的日志文件。程序运行本身没有问题。
标签: java dll native rxtx jvm-crash