Java虚拟机发生EXCEPTION_ACCESS_VIOLATION的可能原因是什么?

38
当Java虚拟机崩溃并生成hs_err_pidXXX.log文件时,出现EXCEPTION_ACCESS_VIOLATION错误,这表示什么?该错误本身基本上是一个空指针异常。它是否总是由JVM中的错误引起,或者还有其他原因,例如硬件故障或软件冲突?
编辑:存在本地组件,这是win32上的SWT应用程序。

2
你是否在进行任何涉及本地代码的工作,例如Java3D之类的东西? - Michael Myers
7个回答

20

大多数情况下,这是虚拟机中的一个错误,但它也可能由任何本机代码(例如JNI调用)引起。

hs_err_pidXXX.log 文件应该包含有关问题发生位置的一些信息。

您还可以检查文件中的“Heap”部分。许多虚拟机错误是由垃圾收集(特别是旧版虚拟机)引起的。此部分应该显示在崩溃时垃圾是否正在运行。此外,此部分还显示堆的某些部分是否已填充(百分比数字)。

在低内存情况下,虚拟机崩溃的可能性要高得多。


7
如何检查垃圾回收是否在崩溃期间运行? - Dattatreya Kugve
在我的情况下,这种情况是随机发生的:https://stackoverflow.com/questions/68808682/how-to-debug-java-exception-access-violation-error - arielma

9

找到答案了!

我曾经遇到同样的错误,并注意到提供 pid 日志文件内容的其他人都在运行 64 位 Windows,就像我一样。在日志文件的末尾,它包括 PATH 语句。在那里,我可以看到 C:\Windows\SysWOW64 不正确地列在 %SystemRoot%\system32 的前面。一旦我更正了这个问题,异常就消失了。


非常感谢!原来我的PATH变量里有一个错误的输入,纠正后问题解决了。 - Meghan

2

首先,您应该将JVM升级到最新版本。

您能再描述一下问题吗?还是它似乎是随机发生的?最近我们遇到了一个问题,JVM在随机时间崩溃。结果发现是硬件问题。我们将驱动器放入了新服务器后,问题完全消失了。

总之,JVM不应该崩溃,如上面的帖子所提到的,如果您没有进行任何JNI操作,那么我的直觉是您有硬件问题。


请问您能描述一下具体是什么问题吗?我正在处理这个错误,思考如何检测硬件问题。 - unorsk
检测硬件问题的一种方法是查看Windows的“事件查看器”。很有可能会在那里报告硬件问题。 - frewper

1
如果您知道该查找什么,问题的原因将在hs_err*文件中记录。请查看,如果仍然不清楚,请考虑发布堆栈跟踪的前5或10行以及其他相关信息(不要发布整个内容,其中有大量信息是无用的 - 但您必须找出哪个1% 重要的 :-) )

0

我有一个使用了很长时间且非常可靠的JNLP应用程序,现在遇到了同样的问题。这个问题是在我从Windows 7升级到Windows 10后立即开始出现的。根据我的调查,最可能是Win 10中的一个错误。

以下不是解决方案,而是一个丑陋的解决方法。在jre/bin目录下,有一个javaws.exe文件。如果我右键单击/属性/兼容性并勾选以管理员身份运行此程序,JNLP应用程序就可以正常工作了。

请注意,这种方法可能会导致安全问题,请仅在没有其他选择并且100%知道自己在做什么时使用它。


0

您是否正在使用浏览器小部件并在其中执行JavaScript?如果是这样,那么在某些版本的SWT中存在错误,会导致JVM在本机代码中崩溃,在各种Windows库中。

我打开的两个示例是bug 217306bug 127960。然而,这两个错误报告并不是JVM在SWT中崩溃的唯一错误报告。

如果您没有使用浏览器小部件,则这些建议对您没有帮助。在这种情况下,您可以搜索SWT错误导致JVM崩溃的列表。如果这些都不是您的问题,那么我强烈建议您向SWT提交错误报告。


0
在Java版本1.8.0_271-b09上遇到了致命错误EXCEPTION_ACCESS_VIOLATION。查看了hs_err_pidxxx.log文件后发现,垃圾回收过程中出现了问题。垃圾回收后堆空间没有释放。结果发现,只需要关闭一些未使用的应用程序以释放内存。将内存使用量降低到16GB RAM Windows 10机器的50%,再次运行Java应用程序,错误消失了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接