Java JVM中的堆栈溢出分段错误,但仅在VMWare上

Java JVM中的堆栈溢出分段错误,但仅在VMWare上,java,jboss,jvm,vmware,Java,Jboss,Jvm,Vmware,我们有一个应用程序在JBoss上运行。此应用程序有一个或两个导致无限递归的bug,导致stackOverflowException。不是最优的,但不是灾难 我们最近尝试转移到VMWare,同样的异常现在已经成为分段故障,导致整个应用程序服务器和JVM随之停机 没有任何stackOverflowException能够做到这一点,到目前为止,我还无法创建一段简单的代码来重现这个bug 你知道为什么会存在这种差异吗 处理内存的方式可能有所不同。Ie您有不同的操作系统版本,或者与VMWare的交互中存在

我们有一个应用程序在JBoss上运行。此应用程序有一个或两个导致无限递归的bug,导致stackOverflowException。不是最优的,但不是灾难

我们最近尝试转移到VMWare,同样的异常现在已经成为分段故障,导致整个应用程序服务器和JVM随之停机

没有任何stackOverflowException能够做到这一点,到目前为止,我还无法创建一段简单的代码来重现这个bug


你知道为什么会存在这种差异吗

处理内存的方式可能有所不同。Ie您有不同的操作系统版本,或者与VMWare的交互中存在错误

你说得对,这是不可能的。我还要检查您是否有最新的、受支持的Java版本。

如果JVM正在发生故障,并且您的应用程序不涉及本机代码库(称为使用JNI或JNA),这就是某种平台错误的证据


在这种情况下,很难确定真正的故障是JVM还是VMWare。我倾向于指责VMWare没有提供“普通”PC行为的忠实实现。然而,当Java堆栈溢出且处理器试图读取或写入堆栈的保护页时,JVM可能没有根据地假设x86或x86-64处理器的行为方式。

这似乎是Linux系统上运行Oracle/Sun JVM HotSpot的一个错误


如果您使用Oracle/Sun JVM尝试该应用程序,您将得到一个分段错误。另一方面,如果您尝试使用OpenJDK运行相同的应用程序,您可能会看到StackOverflow错误。

为什么不等到seg故障发生后再进行内核转储?在我看来,这是找出问题所在的最简单方法。试过了。核心转储已损坏,gdb甚至无法提供有用的回溯。出了点问题。什么操作系统(虚拟机和物理)?物理设置和虚拟机中有多少内存?物理设置和虚拟设置中的CPU数量是否相同?(有多少?)它发生在debian和redhat上,使用4G到8G或ram,以及在ESX和ESXi上的主机操作系统上,使用oracle hotspot jvm,java版本1.6 u 12和u27。