我的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
答案 0 :(得分:3)
我只是遇到了同样的错误,它恰好是新的Direct3d加速Java2d功能的一个错误,1.6.0_11发生在具有低视频内存的机器上。 如果您使用-Dsun.java2d.d3d = false启动应用程序,它应该再次运行。 跟踪此问题的太阳虫如下:http://bugs.sun.com/view_bug.do?bug_id=6788497
答案 1 :(得分: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库中的错误。
答案 2 :(得分:1)
仅仅因为您故意使用的本机代码的唯一部分是JNI /任何并不意味着像您这样的崩溃在位置或时间上与它相关。在任何给定的JVM /执行中都会默默地使用各种本机支持,而且我曾经有过一次由于早期发生的腐败以及JVM本身而导致的奇怪崩溃。
在我的情况下,我在闪亮的新型多CPU(Niagara)盒子上找到了并发GC线程中的令人兴奋的错误,这让各种炸弹等待关闭,我有没有我的应用程序中的非JDK本机代码。
当Sun的GC团队修复了他们的错误(非常友好地为我提供了一个测试盗版VM)时,我的问题就消失了(好吧,经过一两轮之后,这个问题)。
RGDS
戴蒙
答案 3 :(得分:0)
您遇到了访问冲突,这意味着某些代码试图访问不允许访问的地址,这通常是因为给定地址没有任何内存。堆栈跟踪指向跳过问题的位置,可能或可能不是是问题的根源。人们在谈论本机代码时有时会忘记这一点,即使他们已经意识到这一点。
我使用过JNA,但从未遇到任何问题。如果存在访问冲突,那是我的错。这是一些简单的建议。
确保您的机器声音良好。使用Memtest86+测试你的记忆力。如果它是硬件问题,那就找不到软件错误。
使用JNA查看代码。请注意,即使Java中的调用看起来不显眼,您也可以编写可以搞乱任何内容的低级代码。很可能,使用JNA的代码做错了并破坏了内存。例如,确保使用正确的调用约定和数据对齐。如果有疑问,请让一个对C感到满意的人(或更普遍的低级别的东西)来帮助你。
不要完全排除其他因素。你可能会遇到JVM错误或其他问题,但要小心这是多少。如果你听到蹄声,想想马匹,而不是斑马。