Java Access Bridge在releaseJavaObject()上导致JVM崩溃
本文关键字:JVM 崩溃 Access Bridge releaseJavaObject Java | 更新日期: 2023-09-27 18:07:50
我正在使用Java Access Bridge从Oracle接口提取数据,并且偶尔会出现以下崩溃(我假设当我调用releaseJavaObject()
时-当我删除这些代码行时,问题就消失了。
这是崩溃日志:
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d9104dd, pid=7784, tid=5868
#
# JRE version: 6.0_14-b08
# Java VM: Java HotSpot(TM) Client VM (14.0-b16 mixed mode, sharing windows-x86 )
# Problematic frame:
# V [jvm.dll+0x1104dd]
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
#
--------------- T H R E A D ---------------
Current thread (0x04036000): JavaThread "Thread-5" [_thread_in_vm, id=5868, stack(0x046e0000,0x04730000)]
siginfo: ExceptionCode=0xc0000005, reading address 0x00000001
Registers:
EAX=0x00000001, EBX=0x23ec7730, ECX=0x00000000, EDX=0x00227c98
ESP=0x0472f504, EBP=0x0472f510, ESI=0x007a0128, EDI=0x04026b8c
EIP=0x6d9104dd, EFLAGS=0x00010202
Top of Stack: (sp=0x0472f504)
0x0472f504: 04026b8c 00227c98 04036000 0472f524
0x0472f514: 6d9105a9 23ec7730 23ec7730 04026f54
0x0472f524: 0472f54c 6d8f1dca 04026b8c 04036000
0x0472f534: 04036110 2bfbf9a0 04036000 00000000
0x0472f544: 0472f534 0472f56c 0472f578 6d0717bd
0x0472f554: 04036110 0472f588 04036000 23ec7b88
0x0472f564: 2bfbf9a0 0472f55c 0472f798 6d0bded0
0x0472f574: 00000000 0472f598 01ef6fc3 04036110
Instructions: (pc=0x6d9104dd)
0x6d9104cd: 00 00 5e 89 18 5b 5d c2 04 00 8b 86 90 00 00 00
0x6d9104dd: 8b 08 5f 89 8e 90 00 00 00 5e 89 18 5b 5d c2 04
Stack: [0x046e0000,0x04730000], sp=0x0472f504, free space=317k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V [jvm.dll+0x1104dd]
V [jvm.dll+0x1105a9]
V [jvm.dll+0xf1dca]
C [awt.dll+0x717bd]
J sun.awt.windows.WComponentPeer.getLocationOnScreen()Ljava/awt/Point;
J java.awt.Component.getLocationOnScreen_NoTreeLock()Ljava/awt/Point;
J java.awt.Component.getLocationOnScreen()Ljava/awt/Point;
j oracle.ewt.lwAWT.LWDataSourceList$Child.getLocationOnScreen()Ljava/awt/Point;+4
J com.sun.java.accessibility.AccessBridge.getAccessibleBoundsOnScreenFromContext(Ljavax/accessibility/AccessibleContext;)Ljava/awt/Rectangle;
j com.sun.java.accessibility.AccessBridge.getAccessibleXcoordFromContext(Ljavax/accessibility/AccessibleContext;)I+6
v ~StubRoutines::call_stub
V [jvm.dll+0xecabc]
V [jvm.dll+0x173d61]
V [jvm.dll+0xecb3d]
V [jvm.dll+0xf594f]
V [jvm.dll+0xf7777]
Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
J sun.awt.windows.WComponentPeer.getLocationOnScreen()Ljava/awt/Point;
J java.awt.Component.getLocationOnScreen_NoTreeLock()Ljava/awt/Point;
J java.awt.Component.getLocationOnScreen()Ljava/awt/Point;
j oracle.ewt.lwAWT.LWDataSourceList$Child.getLocationOnScreen()Ljava/awt/Point;+4
J com.sun.java.accessibility.AccessBridge.getAccessibleBoundsOnScreenFromContext(Ljavax/accessibility/AccessibleContext;)Ljava/awt/Rectangle;
j com.sun.java.accessibility.AccessBridge.getAccessibleXcoordFromContext(Ljavax/accessibility/AccessibleContext;)I+6
v ~StubRoutines::call_stub
j com.sun.java.accessibility.AccessBridge.run()V+0
j java.lang.Thread.run()V+11
v ~StubRoutines::call_stub
--------------- P R O C E S S ---------------
Java Threads: ( => current thread )
0x04052400 JavaThread "Image Fetcher 0" daemon [_thread_blocked, id=7976, stack(0x04e60000,0x04eb0000)]
0x0716ac00 JavaThread "Image Fetcher 0" daemon [_thread_blocked, id=5484, stack(0x07770000,0x077c0000)]
0x0716a000 JavaThread "Flush Queue" [_thread_blocked, id=4588, stack(0x055d0000,0x05620000)]
0x04053000 JavaThread "Thread-11" [_thread_in_native, id=6544, stack(0x054f0000,0x05540000)]
0x04052800 JavaThread "CursorIdler" [_thread_blocked, id=3328, stack(0x054a0000,0x054f0000)]
0x0404f800 JavaThread "TaskScheduler timer" [_thread_blocked, id=1180, stack(0x05300000,0x05350000)]
0x04051c00 JavaThread "Busy indicator" daemon [_thread_blocked, id=5072, stack(0x05280000,0x052d0000)]
0x04051000 JavaThread "HeartBeat" [_thread_blocked, id=3960, stack(0x05230000,0x05280000)]
0x04050c00 JavaThread "Forms-StreamMessageWriter" [_thread_blocked, id=6008, stack(0x04fc0000,0x05010000)]
0x04050400 JavaThread "Forms-StreamMessageReader" [_thread_in_native, id=2480, stack(0x04f70000,0x04fc0000)]
0x0404f400 JavaThread "Keep-Alive-Timer" daemon [_thread_blocked, id=7112, stack(0x059c0000,0x05a10000)]
0x0404bc00 JavaThread "thread applet-oracle.forms.engine.Main-1" [_thread_blocked, id=4376, stack(0x049b0000,0x04a00000)]
0x0404e000 JavaThread "AWT-EventQueue-2" [_thread_blocked, id=8020, stack(0x04dc0000,0x04e10000)]
0x0404dc00 JavaThread "Applet 1 LiveConnect Worker Thread" [_thread_blocked, id=7500, stack(0x04730000,0x04780000)]
0x0404d400 JavaThread "Browser Side Object Cleanup Thread" [_thread_blocked, id=1888, stack(0x04d70000,0x04dc0000)]
0x0404d000 JavaThread "Windows Tray Icon Thread" [_thread_in_native, id=4396, stack(0x04b10000,0x04b60000)]
0x0404c800 JavaThread "CacheCleanUpThread" daemon [_thread_blocked, id=252, stack(0x04ac0000,0x04b10000)]
0x0404c400 JavaThread "CacheMemoryCleanUpThread" daemon [_thread_blocked, id=7492, stack(0x04a00000,0x04a50000)]
0x0404b400 JavaThread "Java Plug-In Heartbeat Thread" [_thread_blocked, id=5644, stack(0x04960000,0x049b0000)]
0x04036c00 JavaThread "AWT-EventQueue-0" [_thread_blocked, id=7224, stack(0x04910000,0x04960000)]
=>0x04036000 JavaThread "Thread-5" [_thread_in_vm, id=5868, stack(0x046e0000,0x04730000)]
0x04037800 JavaThread "EventQueueMonitor-ComponentEvtDispatch" [_thread_blocked, id=7964, stack(0x04690000,0x046e0000)]
0x04023800 JavaThread "AWT-Windows" daemon [_thread_in_native, id=7752, stack(0x04640000,0x04690000)]
0x04023000 JavaThread "AWT-Shutdown" [_thread_blocked, id=1388, stack(0x045f0000,0x04640000)]
0x04022c00 JavaThread "Java2D Disposer" daemon [_thread_blocked, id=5564, stack(0x045a0000,0x045f0000)]
0x0086f800 JavaThread "Java Plug-In Pipe Worker Thread (Client-Side)" daemon [_thread_in_native, id=5864, stack(0x043f0000,0x04440000)]
0x04013400 JavaThread "traceMsgQueueThread" daemon [_thread_blocked, id=3684, stack(0x03f20000,0x03f70000)]
0x00827400 JavaThread "Timer-0" [_thread_blocked, id=4840, stack(0x03dc0000,0x03e10000)]
0x00804c00 JavaThread "Low Memory Detector" daemon [_thread_blocked, id=3712, stack(0x03d20000,0x03d70000)]
0x00800800 JavaThread "CompilerThread0" daemon [_thread_blocked, id=6924, stack(0x03cd0000,0x03d20000)]
0x007ff000 JavaThread "Attach Listener" daemon [_thread_blocked, id=8092, stack(0x03c80000,0x03cd0000)]
0x007f4400 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=6432, stack(0x00970000,0x009c0000)]
0x007b3c00 JavaThread "Finalizer" daemon [_thread_blocked, id=8136, stack(0x00920000,0x00970000)]
0x007af400 JavaThread "Reference Handler" daemon [_thread_blocked, id=7184, stack(0x008d0000,0x00920000)]
0x0022a000 JavaThread "main" [_thread_blocked, id=7496, stack(0x00350000,0x003a0000)]
Other Threads:
0x007adc00 VMThread [stack: 0x00880000,0x008d0000] [id=7120]
0x00806000 WatcherThread [stack: 0x03d70000,0x03dc0000] [id=3704]
VM state:not at safepoint (normal execution)
VM Mutex/Monitor currently owned by a thread: ([mutex/lock_event])
[0x00227c98] JNIGlobalHandle_lock - owner thread: 0x04036000
Heap
def new generation total 1792K, used 1493K [0x236e0000, 0x238d0000, 0x23bc0000)
eden space 1600K, 92% used [0x236e0000, 0x23850b20, 0x23870000)
from space 192K, 9% used [0x238a0000, 0x238a4af8, 0x238d0000)
to space 192K, 0% used [0x23870000, 0x23870000, 0x238a0000)
tenured generation total 22296K, used 18551K [0x23bc0000, 0x25186000, 0x276e0000)
the space 22296K, 83% used [0x23bc0000, 0x24dddcc8, 0x24ddde00, 0x25186000)
compacting perm gen total 12288K, used 8352K [0x276e0000, 0x282e0000, 0x2b6e0000)
the space 12288K, 67% used [0x276e0000, 0x27f081f8, 0x27f08200, 0x282e0000)
ro space 8192K, 63% used [0x2b6e0000, 0x2bbf96b0, 0x2bbf9800, 0x2bee0000)
rw space 12288K, 53% used [0x2bee0000, 0x2c554b80, 0x2c554c00, 0x2cae0000)
Dynamic libraries:
0x00400000 - 0x00424000 C:'Program Files'Java'jre6'bin'java.exe
0x77c60000 - 0x77d9c000 C:'windows'SYSTEM32'ntdll.dll
0x76ee0000 - 0x76fb4000 C:'windows'system32'kernel32.dll
0x760b0000 - 0x760fa000 C:'windows'system32'KERNELBASE.dll
0x77df0000 - 0x77e90000 C:'windows'system32'ADVAPI32.dll
0x76390000 - 0x7643c000 C:'windows'system32'msvcrt.dll
0x768f0000 - 0x76909000 C:'windows'SYSTEM32'sechost.dll
0x76c90000 - 0x76d31000 C:'windows'system32'RPCRT4.dll
0x75d30000 - 0x75d7c000 C:'windows'system32'apphelp.dll
0x61e20000 - 0x61ead000 C:'windows'AppPatch'AcLayers.DLL
0x75d10000 - 0x75d2b000 C:'windows'system32'SspiCli.dll
0x76820000 - 0x768e9000 C:'windows'system32'USER32.dll
0x76630000 - 0x7667e000 C:'windows'system32'GDI32.dll
0x77dc0000 - 0x77dca000 C:'windows'system32'LPK.dll
0x76bb0000 - 0x76c4d000 C:'windows'system32'USP10.dll
0x76fc0000 - 0x77c0a000 C:'windows'system32'SHELL32.dll
0x76100000 - 0x76157000 C:'windows'system32'SHLWAPI.dll
0x76980000 - 0x76adc000 C:'windows'system32'ole32.dll
0x76160000 - 0x761ef000 C:'windows'system32'OLEAUT32.dll
0x75410000 - 0x75427000 C:'windows'system32'USERENV.dll
0x75e00000 - 0x75e0b000 C:'windows'system32'profapi.dll
0x72f20000 - 0x72f71000 C:'windows'system32'WINSPOOL.DRV
0x6fd50000 - 0x6fd62000 C:'windows'system32'MPR.dll
0x77da0000 - 0x77dbf000 C:'windows'system32'IMM32.DLL
0x76ae0000 - 0x76bac000 C:'windows'system32'MSCTF.dll
0x7c340000 - 0x7c396000 C:'Program Files'Java'jre6'bin'msvcr71.dll
0x6d800000 - 0x6da8b000 C:'Program Files'Java'jre6'bin'client'jvm.dll
0x743d0000 - 0x74402000 C:'windows'system32'WINMM.dll
0x6d7b0000 - 0x6d7bc000 C:'Program Files'Java'jre6'bin'verify.dll
0x6d330000 - 0x6d34f000 C:'Program Files'Java'jre6'bin'java.dll
0x6d290000 - 0x6d298000 C:'Program Files'Java'jre6'bin'hpi.dll
0x77de0000 - 0x77de5000 C:'windows'system32'PSAPI.DLL
0x6d7f0000 - 0x6d7ff000 C:'Program Files'Java'jre6'bin'zip.dll
0x6d430000 - 0x6d436000 C:'Program Files'Java'jre6'bin'jp2native.dll
0x6d1d0000 - 0x6d1e3000 C:'Program Files'Java'jre6'bin'deploy.dll
0x75f90000 - 0x760ad000 C:'windows'system32'CRYPT32.dll
0x75e70000 - 0x75e7c000 C:'windows'system32'MSASN1.dll
0x76dc0000 - 0x76eda000 C:'windows'system32'WININET.dll
0x77dd0000 - 0x77dd3000 C:'windows'system32'Normaliz.dll
0x76440000 - 0x765f8000 C:'windows'system32'iertutil.dll
0x76710000 - 0x76820000 C:'windows'system32'urlmon.dll
0x6d6b0000 - 0x6d6f3000 C:'Program Files'Java'jre6'bin'regutils.dll
0x753a0000 - 0x753a9000 C:'windows'system32'VERSION.dll
0x6fd80000 - 0x6ffc0000 C:'windows'system32'msi.dll
0x6d610000 - 0x6d623000 C:'Program Files'Java'jre6'bin'net.dll
0x76c50000 - 0x76c85000 C:'windows'system32'WS2_32.dll
0x76970000 - 0x76976000 C:'windows'system32'NSI.dll
0x75870000 - 0x758ac000 C:'windows'system32'mswsock.dll
0x75860000 - 0x75866000 C:'windows'System32'wship6.dll
0x6d630000 - 0x6d639000 C:'Program Files'Java'jre6'bin'nio.dll
0x6d000000 - 0x6d14a000 C:'Program Files'Java'jre6'bin'awt.dll
0x74d00000 - 0x74e9e000 C:'windows'WinSxS'x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.7601.17514_none_41e6975e2bd6f2b2'comctl32.dll
0x74a40000 - 0x74a53000 C:'windows'system32'DWMAPI.DLL
0x74cc0000 - 0x74d00000 C:'windows'system32'uxtheme.dll
0x75d80000 - 0x75d8c000 C:'windows'system32'CRYPTBASE.dll
0x63420000 - 0x63451000 C:'Program Files'Java'jre6'bin'JavaAccessBridge.dll
0x6d360000 - 0x6d366000 C:'Program Files'Java'jre6'bin'jawt.dll
0x70b90000 - 0x70b9d000 C:'Program Files'Java'jre6'bin'JAWTAccessBridge.dll
0x6d230000 - 0x6d284000 C:'Program Files'Java'jre6'bin'fontmanager.dll
0x759e0000 - 0x759e8000 C:'windows'system32'Secur32.dll
0x75710000 - 0x75754000 C:'windows'system32'dnsapi.DLL
0x73ff0000 - 0x7400c000 C:'windows'system32'iphlpapi.DLL
0x73fd0000 - 0x73fd7000 C:'windows'system32'WINNSI.DLL
0x752f0000 - 0x752f5000 C:'windows'System32'wshtcpip.dll
0x72b70000 - 0x72b94000 C:'Program Files'Common Files'Microsoft Shared'Windows Live'WLIDNSP.DLL
0x72490000 - 0x72496000 C:'windows'system32'rasadhlp.dll
0x73ea0000 - 0x73ed8000 C:'windows'System32'fwpuclnt.dll
0x67d00000 - 0x67d3a000 C:'Program Files'UltraMon'RTSUltraMonHook.dll
0x67d40000 - 0x67d91000 C:'Program Files'UltraMon'UltraMonResButtons.dll
0x74b30000 - 0x74cc0000 C:'windows'WinSxS'x86_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.7601.17514_none_72d18a4386696c80'gdiplus.dll
0x74680000 - 0x7477b000 C:'windows'system32'WindowsCodecs.dll
0x75920000 - 0x75936000 C:'windows'system32'CRYPTSP.dll
0x75630000 - 0x7566b000 C:'windows'system32'rsaenh.dll
0x74220000 - 0x74230000 C:'windows'system32'NLAapi.dll
0x72bc0000 - 0x72bd0000 C:'windows'system32'napinsp.dll
0x72ba0000 - 0x72bb2000 C:'windows'system32'pnrpnsp.dll
0x72b60000 - 0x72b68000 C:'windows'System32'winrnr.dll
VM Arguments:
jvm_args: -D__jvm_launched=612118666339 -Xbootclasspath/a:C:''PROGRA~1''Java''jre6''lib''deploy.jar;C:''PROGRA~1''Java''jre6''lib''javaws.jar;C:''PROGRA~1''Java''jre6''lib''plugin.jar -Dsun.plugin2.jvm.args=-D__jvm_launched=612118666339 "-Xbootclasspath/a:C:''''PROGRA~1''''Java''''jre6''''lib''''deploy.jar;C:''''PROGRA~1''''Java''''jre6''''lib''''javaws.jar;C:''''PROGRA~1''''Java''''jre6''''lib''''plugin.jar" "-Djava.class.path=C:''''PROGRA~1''''Java''''jre6''''classes" --- --
java_command: sun.plugin2.main.client.PluginMain write_pipe_name=jpi2_pid7848_pipe3,read_pipe_name=jpi2_pid7848_pipe2
Launcher Type: SUN_STANDARD
Environment Variables:
PATH=C:'Program Files'Common Files'Microsoft Shared'Windows Live;C:'windows'system32;C:'windows;C:'windows'System32'Wbem;C:'windows'System32'WindowsPowerShell'v1.0';C:'Program Files'Intel'WiFi'bin';C:'Program Files'Common Files'Intel'WirelessCommon';C:'Program Files'Toshiba'Bluetooth Toshiba Stack'sys';C:'Program Files'QuickTime'QTSystem';C:'Program Files'Ericsson'Solidus eCare'Applications'Bin;C:'Program Files'Common Files'EricssonShare;C:'Program Files'Common Files'EricssonShare'NextCCShare;C:'Program Files'Ericsson'Solidus eCare'ScriptManager'Bin;C:'Program Files'Ericsson'Solidus eCare'ScriptManager'Bin'ThirdParty;C:'Program Files'Bitvise Tunnelier;C:'Program Files'Internet Explorer;
USERNAME=HomeTest
OS=Windows_NT
PROCESSOR_IDENTIFIER=x86 Family 6 Model 37 Stepping 5, GenuineIntel
--------------- S Y S T E M ---------------
OS: Windows 7 Build 7601 Service Pack 1
CPU:total 4 (8 cores per cpu, 2 threads per core) family 6 model 37 stepping 5, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3, sse4.1, sse4.2, ht
Memory: 4k page, physical 2097151k(951176k free), swap 4194303k(3170808k free)
vm_info: Java HotSpot(TM) Client VM (14.0-b16) for windows-x86 JRE (1.6.0_14-b08), built on May 21 2009 08:03:56 by "java_re" with MS VC++ 7.1
time: Mon Sep 05 09:29:29 2011
elapsed time: 16 seconds
下面是触发它的代码:
public static AccessibleTreeItem GetAccessibleContextInfo(Int32 vmID, IntPtr ac, out AccessibleContextInfo acInfo, AccessibleTreeItem parentItem)
{
unsafe
{
// Allocate global memory space for the size of AccessibleContextInfo and store the address in acPtr
IntPtr acPtr = Marshal.AllocHGlobal(Marshal.SizeOf(new AccessibleContextInfo()));
try
{
Marshal.StructureToPtr(new AccessibleContextInfo(), acPtr, true);
if (WABAPI.getAccessibleContextInfo(vmID, ac, acPtr))
{
acInfo = (AccessibleContextInfo)Marshal.PtrToStructure(acPtr, typeof(AccessibleContextInfo));
if (!ReferenceEquals(acInfo, null))
{
IntPtr ati = Marshal.AllocHGlobal(Marshal.SizeOf(new AccessibleTextItemsInfo()));
WABAPI.getAccessibleTextItems(vmID, ac, ati, 0); //THIS IS WHERE WE DO IT
AccessibleTextItemsInfo atInfo = (AccessibleTextItemsInfo)Marshal.PtrToStructure(ati, typeof(AccessibleTextItemsInfo));
IntPtr ainfo = Marshal.AllocHGlobal(Marshal.SizeOf(new AccessibleTextInfo()));
WABAPI.getAccessibleTextInfo(vmID, ac, ainfo, 0, 0);
AccessibleTextInfo atextInfo = (AccessibleTextInfo)Marshal.PtrToStructure(ati, typeof(AccessibleTextInfo));
AccessibleTreeItem newItem = BuildAccessibleTree(acInfo, atInfo, parentItem, acPtr, atextInfo);
newItem.setAccessibleText(atInfo, atextInfo);
if (ati != IntPtr.Zero)
{
Marshal.FreeHGlobal(ati);
}
if (ainfo != IntPtr.Zero)
{
Marshal.FreeHGlobal(ainfo);
}
if (!ReferenceEquals(newItem, null))
{
for (int i = 0; i < acInfo.childrenCount; i++)
{
//Used roles = text, page tab, push button
if (acInfo.role_en_US != "unknown" && acInfo.states_en_US.Contains("visible")) // Note the optomization here, I found this get me to an acceptable speed
{
AccessibleContextInfo childAc = new AccessibleContextInfo();
IntPtr childContext = WABAPI.getAccessibleChildFromContext(vmID, ac, i);
GetAccessibleContextInfo(vmID, childContext, out childAc, newItem);
//WABAPI.releaseJavaObject(vmID, childContext);
}
}
}
return newItem;
}
}
else
{
acInfo = new AccessibleContextInfo();
}
}
finally
{
//WABAPI.releaseJavaObject(vmID, ac);
if (acPtr != IntPtr.Zero)
Marshal.FreeHGlobal(acPtr);
}
}
return null;
}
当我取消注释具有WABAPI.releaseJavaObject(vmID, jobject)
的行时,我得到了结果崩溃。有时。我已经检查了vmID和ac,以确保它们是有效值(即非0),但问题仍然发生。
我的程序在没有releaseJavaObject()
线的情况下正常工作,但是RAM使用气球和整个系统将会停止。这当然是意料之中的,因为JAB文档建议需要释放所有对象,以免发生内存泄漏。
谁能告诉我为什么releaseJavaObject()
崩溃?
我应该注意到,我上面使用的函数是从Oracle论坛复制粘贴的,我没有研究它是如何工作的。但这是使用不安全代码的唯一位置,我的应用程序和JAB之间的所有交互都发生在那个函数中。
因为函数是递归调用的,所以它会在'finally'块中释放父对象的句柄,然后转到下一个子对象。没有父句柄,函数失败(没有任何错误捕获,d'oh),并且JVM因ac的无效值而崩溃。