2

我有一个 Java swing 应用程序,它订阅大量数据并以各种方式显示这些数据。在繁重的负载下,我发现 JRE 只是停止工作并显示消息“Java(TM) Platform SE 二进制文件已停止工作”。这显然会关闭我的应用程序,我需要重新启动它。我试图用谷歌搜索解决这个问题的方法,因为我的代码中没有堆栈跟踪或任何我可以使用的东西,但除了升级/重新安装 JRE 和运行病毒扫描之外,我发现的有用信息很少。我已经完成了这两项措施并重新启动了服务器,但问题仍然存在。我曾尝试使用 Java VisualVM 监控该过程(请参阅下面的转储),但我不是该工具的专家,可能不知道要寻找什么。我所做的观察是“崩溃”

该问题很容易重现,并在运行应用程序大约 10 分钟后发生。我不使用任何特定的 jvm 参数运行应用程序。Java 版本是 1.6.0_31(升级前是 _25),我在 Windows 7 64 位上运行。

在 VisualVM 的下图中,Java 二进制文件刚刚停止工作,这似乎与 GC 运行一致。 从 Java VisualVM 转储

非常感谢任何帮助或想法,以便我可以解决或解决问题。谢谢。

4

2 回答 2

3

要检查的三件事:

  1. 如果您在finalize()任何地方实现了该方法,请确保它不会直接或间接锁定任何对象;这可能会导致与 GC 相关的灾难性死锁。

  2. 如果您有本机代码,如果代码没有正确使用全局引用,则可能会发生任何奇怪的事情,包括死锁和奇怪的内存损坏,这将再次与 GC 活动相关。

  3. 最后,GC 可能只是“搅局”并暴露应用程序中原本存在的普通死锁;检查您的同步协议。

于 2012-04-23T18:03:23.563 回答
2

垃圾收集会在发生时暂停 VM 的应用程序线程,这可能会在某处暴露竞争条件。

于 2012-04-23T18:00:15.593 回答