在我的java应用程序中,多个线程通过dll(名为ProcessDLL.dll)定期获取系统的“进程列表”。当我的应用程序中只有一个线程时,它工作正常。但是对于多个线程,我得到 EXCEPTION_ACCESS_VIOLATION 。 这是DLL实现的问题还是在多个线程试图访问dll的java应用程序中?任何想法......
以下是我的错误日志:
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x7c9108d3, pid=2880, tid=1584
#
# JRE version: 6.0_16-b01
# Java VM: Java HotSpot(TM) Client VM (14.2-b01 mixed mode windows-x86 )
# Problematic frame:
# C [ntdll.dll+0x108d3]
#
# 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.
#
--------------- T H R E A D ---------------
Current thread (0x0a9c9800): JavaThread "taskmgr" [_thread_in_native, id=1584, stack(0x0be70000,0x0bec0000)]
siginfo: ExceptionCode=0xc0000005, reading address 0x656c6441
Registers:
EAX=0x656c6441, EBX=0x0b2f0178, ECX=0x656c6449, EDX=0x000001aa
ESP=0x0bebf778, EBP=0x0bebf834, ESI=0x0b3a31b0, EDI=0x0b2f0000
EIP=0x7c9108d3, EFLAGS=0x00010293
Top of Stack: (sp=0x0bebf778)
0x0bebf778: 0b2f21d0 0b3a3860 00000000 00000000
0x0bebf788: 0bebf76c 0b3a31b0 0b2f0178 7403c6dc
0x0bebf798: 0b3b3c50 ffffffff 74005087 74005bec
0x0bebf7a8: 0b3b0ff8 0b6e30b8 656c6441 00000000
0x0bebf7b8: 00000000 0bebf7f0 00000000 0b6e2fa8
0x0bebf7c8: 0b2a1ef8 6a957160 656c6449 000006a8
0x0bebf7d8: 0b6e7740 00000001 0b712c98 00000035
0x0bebf7e8: 0bebf80c 7400605b 0b3b0ff8 74004866
Instructions: (pc=0x7c9108d3)
0x7c9108c3: d9 74 16 8d 41 f8 89 85 7c ff ff ff 66 8b 55 e4
0x7c9108d3: 66 3b 10 0f 87 93 fe ff ff 8d 46 08 89 85 64 ff
Stack: [0x0be70000,0x0bec0000], sp=0x0bebf778, free space=317k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C [ntdll.dll+0x108d3]
C [ProcessDLL.dll+0x127a2]
Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j process.info.NTProcessWin32.jniGetProcessInfosN([Ljava/lang/String;J)[Lprocess/info/NTProcess;+0
j process.info.NTProcessWin32.getProcessInfos([Ljava/lang/String;J)[Lprocess/info/NTProcess;+9
j process.info.InstanceController.getAndSetProcesses()V+17
j process.info.ControllerImpl$UpdateGraphTimer.run()V+7
j java.util.TimerThread.mainLoop()V+221
j java.util.TimerThread.run()V+1
v ~StubRoutines::call_stub
--------------- P R O C E S S ---------------
Java Threads: ( => current thread )
0x003a7000 JavaThread "DestroyJavaVM" [_thread_blocked, id=1288, stack(0x00840000,0x00890000)]
=>0x0a9c9800 JavaThread "taskmgr" [_thread_in_native, id=1584, stack(0x0be70000,0x0bec0000)]
0x0afb8400 JavaThread "notepad" [_thread_blocked, id=3408, stack(0x0be20000,0x0be70000)]
0x0aee8800 JavaThread "mspaint" [_thread_blocked, id=3188, stack(0x0bdd0000,0x0be20000)]
0x0aee7400 JavaThread "mmc" [_thread_blocked, id=3196, stack(0x0bd80000,0x0bdd0000)]
0x0aa5dc00 JavaThread "firefox" [_thread_blocked, id=1224, stack(0x0bd30000,0x0bd80000)]
0x0b0b7c00 JavaThread "eclipse" [_thread_in_native, id=2628, stack(0x0bc80000,0x0bcd0000)]
0x0b7e4400 JavaThread "cmd" [_thread_blocked, id=3804, stack(0x0bc30000,0x0bc80000)]
0x0b7e0800 JavaThread "7zFM" [_thread_blocked, id=296, stack(0x0bbe0000,0x0bc30000)]
0x0b0b5000 JavaThread "Keep-Alive-Timer" daemon [_thread_blocked, id=3724, stack(0x0b790000,0x0b7e0000)]
0x0af9cc00 JavaThread "Thread-1" daemon [_thread_blocked, id=244, stack(0x0b0c0000,0x0b110000)]
0x0aa5a800 JavaThread "Low Memory Detector" daemon [_thread_blocked, id=1480, stack(0x0ae20000,0x0ae70000)]
0x0aa57400 JavaThread "CompilerThread0" daemon [_thread_blocked, id=3656, stack(0x0add0000,0x0ae20000)]
0x0aa52800 JavaThread "JDWP Command Reader" daemon [_thread_in_native, id=3756, stack(0x0ad80000,0x0add0000)]
0x0aa47400 JavaThread "JDWP Event Helper Thread" daemon [_thread_blocked, id=3672, stack(0x0ad30000,0x0ad80000)]
0x0aa44c00 JavaThread "JDWP Transport Listener: dt_socket" daemon [_thread_blocked, id=3500, stack(0x0ace0000,0x0ad30000)]
0x0aa39c00 JavaThread "Attach Listener" daemon [_thread_blocked, id=3660, stack(0x0abf0000,0x0ac40000)]
0x0aa38800 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=2604, stack(0x0aba0000,0x0abf0000)]
0x0aa29400 JavaThread "Finalizer" daemon [_thread_blocked, id=1628, stack(0x0ab50000,0x0aba0000)]
0x0aa24c00 JavaThread "Reference Handler" daemon [_thread_blocked, id=3940, stack(0x0ab00000,0x0ab50000)]
Other Threads:
0x0aa20800 VMThread [stack: 0x0aab0000,0x0ab00000] [id=3048]
0x0aa6e000 WatcherThread [stack: 0x0ae70000,0x0aec0000] [id=3232]
VM state:not at safepoint (normal execution)
VM Mutex/Monitor currently owned by a thread: None
Heap
def new generation total 960K, used 733K [0x02910000, 0x02a10000, 0x02df0000)
eden space 896K, 74% used [0x02910000, 0x029b76a8, 0x029f0000)
from space 64K, 99% used [0x02a00000, 0x02a0fff8, 0x02a10000)
to space 64K, 0% used [0x029f0000, 0x029f0000, 0x02a00000)
tenured generation total 4096K, used 3164K [0x02df0000, 0x031f0000, 0x06910000)
the space 4096K, 77% used [0x02df0000, 0x031073c0, 0x03107400, 0x031f0000)
compacting perm gen total 12288K, used 8431K [0x06910000, 0x07510000, 0x0a910000)
the space 12288K, 68% used [0x06910000, 0x0714bc90, 0x0714be00, 0x07510000)
No shared spaces configured.
Dynamic libraries:
0x00400000 - 0x00424000 C:\Program Files\Java\jdk1.6.0_16\bin\javaw.exe
0x7c900000 - 0x7c9b2000 C:\WINDOWS\system32\ntdll.dll
0x7c800000 - 0x7c8f6000 C:\WINDOWS\system32\kernel32.dll
0x77dd0000 - 0x77e6b000 C:\WINDOWS\system32\ADVAPI32.dll
0x77e70000 - 0x77f03000 C:\WINDOWS\system32\RPCRT4.dll
0x77fe0000 - 0x77ff1000 C:\WINDOWS\system32\Secur32.dll
0x7e410000 - 0x7e4a1000 C:\WINDOWS\system32\USER32.dll
0x77f10000 - 0x77f59000 C:\WINDOWS\system32\GDI32.dll
0x76390000 - 0x763ad000 C:\WINDOWS\system32\IMM32.DLL
0x7c340000 - 0x7c396000 C:\Program Files\Java\jdk1.6.0_16\jre\bin\msvcr71.dll
0x6d8b0000 - 0x6db3b000 C:\Program Files\Java\jdk1.6.0_16\jre\bin\client\jvm.dll
0x76b40000 - 0x76b6d000 C:\WINDOWS\system32\WINMM.dll
0x6d860000 - 0x6d86c000 C:\Program Files\Java\jdk1.6.0_16\jre\bin\verify.dll
0x6d3e0000 - 0x6d3ff000 C:\Program Files\Java\jdk1.6.0_16\jre\bin\java.dll
0x6d340000 - 0x6d348000 C:\Program Files\Java\jdk1.6.0_16\jre\bin\hpi.dll
0x76bf0000 - 0x76bfb000 C:\WINDOWS\system32\PSAPI.DLL
0x6d430000 - 0x6d459000 C:\Program Files\Java\jdk1.6.0_16\jre\bin\jdwp.dll
0x6d750000 - 0x6d756000 C:\Program Files\Java\jdk1.6.0_16\jre\bin\npt.dll
0x6d8a0000 - 0x6d8af000 C:\Program Files\Java\jdk1.6.0_16\jre\bin\zip.dll
0x6d2b0000 - 0x6d2b7000 C:\Program Files\Java\jdk1.6.0_16\jre\bin\dt_socket.dll
0x71ab0000 - 0x71ac7000 C:\WINDOWS\system32\WS2_32.dll
0x77c10000 - 0x77c68000 C:\WINDOWS\system32\msvcrt.dll
0x71aa0000 - 0x71aa8000 C:\WINDOWS\system32\WS2HELP.dll
0x71a50000 - 0x71a8f000 C:\WINDOWS\System32\mswsock.dll
0x76f20000 - 0x76f47000 C:\WINDOWS\system32\DNSAPI.dll
0x76d60000 - 0x76d79000 C:\WINDOWS\system32\iphlpapi.dll
0x76fb0000 - 0x76fb8000 C:\WINDOWS\System32\winrnr.dll
0x76f60000 - 0x76f8c000 C:\WINDOWS\system32\WLDAP32.dll
0x76fc0000 - 0x76fc6000 C:\WINDOWS\system32\rasadhlp.dll
0x662b0000 - 0x66308000 C:\WINDOWS\system32\hnetcfg.dll
0x71a90000 - 0x71a98000 C:\WINDOWS\System32\wshtcpip.dll
0x10000000 - 0x1003b000 C:\DATA\ProcessDLL.dll
0x74000000 - 0x74056000 C:\WINDOWS\system32\pdh.dll
0x763b0000 - 0x763f9000 C:\WINDOWS\system32\comdlg32.dll
0x773d0000 - 0x774d3000 C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.6028_x-ww_61e65202\COMCTL32.dll
0x77f60000 - 0x77fd6000 C:\WINDOWS\system32\SHLWAPI.dll
0x7c9c0000 - 0x7d1d7000 C:\WINDOWS\system32\SHELL32.dll
0x77a80000 - 0x77b15000 C:\WINDOWS\system32\CRYPT32.dll
0x77b20000 - 0x77b32000 C:\WINDOWS\system32\MSASN1.dll
0x74320000 - 0x7435d000 C:\WINDOWS\system32\ODBC32.dll
0x711a0000 - 0x711a6000 C:\WINDOWS\system32\odbcbcp.dll
0x77c00000 - 0x77c08000 C:\WINDOWS\system32\VERSION.dll
0x774e0000 - 0x7761e000 C:\WINDOWS\system32\ole32.dll
0x77120000 - 0x771ab000 C:\WINDOWS\system32\OLEAUT32.dll
0x73000000 - 0x73026000 C:\WINDOWS\system32\WINSPOOL.DRV
0x0b280000 - 0x0b297000 C:\WINDOWS\system32\odbcint.dll
0x5e750000 - 0x5e75d000 C:\WINDOWS\system32\perfproc.dll
0x6d6c0000 - 0x6d6d3000 C:\Program Files\Java\jdk1.6.0_16\jre\bin\net.dll
VM Arguments:
jvm_args: -agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:1349 -Dfile.encoding=UTF-8
java_command: process.info.MainClass
Launcher Type: SUN_STANDARD
Environment Variables:
JAVA_HOME=C:\Program Files\Java\jdk1.6.0_16
PATH=C:\Program Files\Java\jdk1.6.0_16\jre\bin;C:/Program Files/Java/jre6/bin/client;C:/Program Files/Java/jre6/bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\Java\jdk1.6.0_16\bin;C:\Program Files\Ant\bin;C:\Program Files\TortoiseSVN\bin;C:\Program Files\NSIS;;C:\WINDOWS\system32\WindowsPowerShell\v1.0;C:\WINDOWS\system32\WindowsPowerShell\v1.0
USERNAME=Administrator
OS=Windows_NT
PROCESSOR_IDENTIFIER=x86 Family 6 Model 42 Stepping 7, GenuineIntel
--------------- S Y S T E M ---------------
OS: Windows XP Build 2600 Service Pack 3
CPU:total 2 (1 cores per cpu, 1 threads per core) family 6 model 42 stepping 7, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3, sse4.1, sse4.2
Memory: 4k page, physical 2096620k(1088228k free), swap 4036496k(3130120k free)
vm_info: Java HotSpot(TM) Client VM (14.2-b01) for windows-x86 JRE (1.6.0_16-b01), built on Jul 31 2009 11:26:58 by "java_re" with MS VC++ 7.1
time: Wed Apr 04 11:15:02 2012
elapsed time: 30 seconds
答案 0 :(得分:4)
我认为PrecessDLL.dll不是线程安全的。您必须同步代码,每次只能访问一次。或者您必须将ProcessDLL.dll修复为多线程安全。
你也可以更新你的JVM(1.6.16已经很老了),但我不认为这个版本会导致错误。
<强>更新强>
#崩溃发生在Java虚拟机之外的本机代码中。
更好的方法(从我的角度来看)是修复DLL。