2

我的 Java UI 意外终止并转储了一个hs_err_pid文件。该文件显示“崩溃发生在 Java 虚拟机之外的本地代码中。” JNA 是我们使用的唯一本机代码。有谁知道可能导致此问题的任何 JNA 版本的任何已知问题或错误。我在下面的错误文件中包含了一些内容。

An unexpected error has been detected by Java Runtime Environment:

EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d02bcbd, pid=312, tid=3616

 Java VM: Java HotSpot(TM) Client VM (11.0-b16 mixed mode, sharing windows-x86)<br>
 Problematic frame:
 C  [awt.dll+0x2bcbd]

 If you would like to submit a bug report, please visit:
   http://java.sun.com/webapps/bugreport/crash.jsp
 The crash happened outside the Java Virtual Machine in native code.
 See problematic frame for where to report the bug.

Current thread (0x02acf000):  JavaThread "AWT-Windows" daemon [_thread_in_native, id=3616, stack(0x02eb0000,0x02f00000)]

siginfo: ExceptionCode=0xc0000005, writing address 0xe2789280


Registers:
EAX=0x234f099c, EBX=0x00001400, ECX=0x00000100, EDX=0xe2789280
ESP=0x02eff4a4, EBP=0x00000400, ESI=0x234f099c, EDI=0xe2789280
EIP=0x6d02bcbd, EFLAGS=0x00010206

Top of Stack: (sp=0x02eff4a4)
0x02eff4a4:   02eff500 00000100 02eff584 00000100
0x02eff4b4:   6d0a5697 00000400 00000400 00000100
0x02eff4c4:   00000100 02eff700 02eff500 00000000
0x02eff4d4:   00000000 00000100 041ac3a0 00000100
0x02eff4e4:   00182620 00000400 e2789280 00000000
0x02eff4f4:   00000000 00000100 00000100 00000000
0x02eff504:   00000000 00000100 00000100 00000000
0x02eff514:   00000000 00000004 00000400 00000000

Instructions: (pc=0x6d02bcbd)
0x6d02bcad:   00 00 00 8b 4c 24 14 8b e9 c1 e9 02 8b f0 8b fa
0x6d02bcbd:   f3 a5 8b cd 83 e1 03 f3 a4 8b 74 24 18 8b 4c 24

Stack: [0x02eb0000,0x02f00000],  sp=0x02eff4a4,  free space=317k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [awt.dll+0x2bcbd]

[error occurred during error reporting (printing native stack), id 0xc0000005]

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  sun.awt.windows.WToolkit.eventLoop()V+0
j  sun.awt.windows.WToolkit.run()V+69
j  java.lang.Thread.run()V+11
v  ~StubRoutines::call_stub
4

4 回答 4

3

我刚刚遇到了同样的错误,这显然是 1.6.0_11 的新 Direct3d 加速 Java2d 功能中的错误,这种错误发生在视频 RAM 较低的机器上。如果您使用 -Dsun.java2d.d3d=false 启动您的应用程序,它应该可以再次工作。跟踪此的太阳错误如下:http ://bugs.sun.com/view_bug.do?bug_id=6788497

于 2009-01-21T01:23:38.670 回答
1

判断从:

Stack: [0x02eb0000,0x02f00000], sp=0x02eff4a4, free space=317k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C [awt.dll+0x2bcbd]

(此时堆栈跟踪显然爆炸了)您可能遇到了 AWT 库中的错误。

于 2008-12-19T00:39:44.567 回答
1

仅仅因为您有意使用的唯一一点本机代码是 JNI/并不意味着像您这样的崩溃在位置或时间上与它有关。在任何给定的 JVM/执行中都默默地使用了各种本机支持,我曾经遇到过由更早发生的损坏和 JVM 本身导致的奇怪崩溃。

就我而言,我在闪亮的新多 CPU (Niagara) 机器上的并发 GC 线程中发现了令人兴奋的错误,这让各种炸弹等待爆炸,而且我的应用程序中没有非 JDK 本机代码一点也不。

当 Sun 的 GC 团队修复了他们的错误(并且非常友好地为我提供了一个测试盗版 VM)时,我的问题消失了(好吧,在一两轮之后,自然而然)。

Rgds

达蒙

于 2008-12-29T12:35:23.440 回答
0

您遇到了访问冲突,这意味着某些代码试图访问它不允许访问的地址,通常是因为给定地址没有任何内存。堆栈跟踪指向发生问题的位置,这可能是也可能不是问题的根源。人们在谈论本机代码时有时会忘记这一点,即使他们不知道这一点。

我用过 JNA,但从来没有遇到过任何问题。如果存在访问冲突,那是我的错。这里有一些简单的建议。

确保您的机器在物理上是健全的。使用Memtest86+测试您的记忆力。如果是硬件问题,那么寻找软件错误是没有用的。

查看使用 JNA 的代码。请注意,即使 Java 中的调用看起来不起眼,您编写的低级代码也可能与任何事情发生冲突。很可能,使用 JNA 的代码会出错并破坏内存。例如,确保使用正确的调用约定和数据对齐方式。如果有疑问,请让熟悉 C(或更一般地说,低级的东西)的人来帮助您。

不要完全排除其他因素。很可能您遇到了 JVM 错误或其他问题,但请注意这种可能性有多大。如果你听到蹄声,想想马,而不是斑马。

于 2008-12-29T13:39:00.113 回答