【问题标题】:Why JVM does not recover after network drive flicks?为什么 JVM 在网络驱动器闪烁后无法恢复?
【发布时间】:2017-07-03 01:03:30
【问题描述】:

Java 应用程序正在网络驱动器上的 Jar 中运行。如果 Jar 文件由于某种原因变得不可用,那么就会出现预期的 NoClassDefFoundError。就像在示例中网络连接丢失一样。但我觉得奇怪的是,如果 Jar 文件所在的网络驱动器上发生故障转移,应用程序仍然会完全崩溃并且无法恢复。

故障转移意味着网络驱动器不会改变,它只是短暂闪烁并立即再次可用,但它会改变某种内部低级驱动器(基础架构人员称之为节点)。发生故障转移(更改节点)后,连接到 Citrix 服务器中运行的应用程序的所有用户都会遇到相同的异常。

我本以为,一旦网络驱动器重新联机,JVM 应该能够恢复,但它似乎试图从 Jar 所在的旧节点而不是新节点获取类。有谁知道为什么JVM会出现这种行为?

【问题讨论】:

  • 它只尝试加载 JAR 文件一次。它将其复制到本地临时文件。
  • 感谢您的评论,如果将 Jar 文件加载到本地临时文件中,那么当网络驱动器不可用时,Java 应用程序给出错误是没有意义的。我描述的场景发生在 Java 应用程序运行时,这意味着它已经成功地将它需要从 Jar 运行的所有内容加载到内存中,直到发生点故障转移,并且故障转移大约需要一秒钟或更短的时间,并且在它发生之后 Jar在同一网络驱动器中仍然可用,但内部“节点”已更改。
  • 但是 JAR 文件无法加载到临时文件中,因为网络错误。
  • jar 类加载到内存并运行应用程序后出现网络错误,如果不理解问题,请不要回复。有人已经回答了有用的信息。

标签: java jar jvm citrix


【解决方案1】:

JVM 只打开一次文件并保持句柄打开以在需要时从中读取类。当网络驱动器断开连接时,句柄变得无效。

大概可以编写一个类加载器来尝试重新打开文件并验证它确实是与以前相同的文件,例如通过散列,但标准实现不是,因为文件系统被认为是可靠的。

从网络驱动器启动的大多数其他可执行程序可能会遇到类似的问题。

您应该使用集群网络文件系统,它不会使应用程序可见的句柄无效,而是透明地进行故障转移。

【讨论】:

  • 谢谢你的解释很有用!
猜你喜欢
  • 2020-04-16
  • 1970-01-01
  • 2020-09-19
  • 1970-01-01
  • 2016-06-12
相关资源
最近更新 更多