win7自動(dòng)升級(jí)到了ie11,但是debug工具太難用了,準(zhǔn)備會(huì)退到9,但是在添加刪除程序里,把ie11的功能關(guān)閉,安裝9時(shí),提示ie已經(jīng)安裝。
并且ie圖標(biāo)也沒了。。progrem files下面的ie啟動(dòng)程序也沒了。。。。
最好在這找到了卸載的辦法
http://www.iefans.net/windows-7-ie11-wufa-xiezai-chongxin-anzhuang-gengxin-banben/
JVM的-XX:[+/-]<option>以前竟然沒注意,mark一個(gè):Boolean options are turned on with -XX:+<option> and turned off with -XX:-<option>.
weblogic.security.SecurityInitializationException: 認(rèn)証が拒否されました。起動(dòng)アイデンティティが有効ではありません。起動(dòng)アイデンティティ?ファイル(boot.properties)のユーザー名またはパスワード(もしくはその雙方)が有効ではありません。起動(dòng)アイデンティティ?ファイルが作成された後に起動(dòng)アイデンティティが変更されていることが考えられます。適切な値のユーザー名およびパスワードで起動(dòng)アイデンティティ?ファイルを編集および更新してください。更新された起動(dòng)アイデンティティ?ファイルを使用して初めてサーバーを起動(dòng)するときには、それらの値は暗號(hào)化されます。
at weblogic.security.service.CommonSecurityServiceManagerDelegateImpl.doBootAuthorization(CommonSecurityServiceManagerDelegateImpl.java:960)
at weblogic.security.service.CommonSecurityServiceManagerDelegateImpl.initialize(CommonSecurityServiceManagerDelegateImpl.java:1054)
at weblogic.security.service.SecurityServiceManager.initialize(SecurityServiceManager.java:873)
at weblogic.security.SecurityService.start(SecurityService.java:148)
at weblogic.t3.srvr.SubsystemRequest.run(SubsystemRequest.java:64)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:256)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)
Caused By: javax.security.auth.login.FailedLoginException: [Security:090303]ユーザーweblogicの認(rèn)証が失敗しました。weblogic.security.providers.authentication.LDAPAtnDelegateException: [Security:090295]予期しない例外が捕捉されました
at weblogic.security.providers.authentication.LDAPAtnLoginModuleImpl.login(LDAPAtnLoginModuleImpl.java:251)
at com.bea.common.security.internal.service.LoginModuleWrapper$1.run(LoginModuleWrapper.java:110)
at java.security.AccessController.doPrivileged(Native Method)
增加了啟動(dòng)參數(shù)t3://AdminServerIP:AdminServerPort(以前都是系統(tǒng)默認(rèn)),發(fā)現(xiàn)啟動(dòng)成功。
最近的項(xiàng)目涉及到了JAVA需要調(diào)用C程序的問題。主要是調(diào)用C寫的加密算法。
主要解決方案是應(yīng)用JNI去調(diào)用C生成的so庫
用eclispe新建一個(gè)java project項(xiàng)目,項(xiàng)目名稱為spidHandle,注意下面VC的項(xiàng)目名稱也是spidHandle,他們分別是用eclispe和VC6.0創(chuàng)建的,不是同個(gè)項(xiàng)目。
編寫一個(gè)JNI入口類SpidHandle.java:
Java代碼

- package com.spidHandle.api;
- public class SpidHandle {
- static {
- System.loadLibrary("spidhandle");
- }
-
- public String buildSpID(String path, String login_name, String password, String key)
- {
- return getSPID(path, login_name, password, key);
- }
-
- public native String getSPID(String path, String login_name, String password, String key);
-
- /**
- * @param args
- *
- * 供測(cè)試用
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- String keyforMD5 = "A6EIo8tuaKS";
- String s = new SpidHandle().buildSpID("/test", "test", "test", keyforMD5);
- System.out.println(s);
- }
-
- }
通過CMD命令窗口,CMD命令窗口定位到SpidHandle.java的目錄下,編譯SpidHandle.java文件:
Java代碼

- javac SpidHandle.java
執(zhí)行JAVAC命令后,在同個(gè)文件目錄下生成SpidHandle.class
將CMD窗口退回到包的根目錄下,如spidHandle工程路徑為:
Z:\project\work_workspace\spidhandle
其中通過編譯后的SpidHandle.class存在于目錄下:
Z:\project\work_workspace\spidhandle\src\com\spidHandle\api
由于SpidHandle類所在的包是com.spidHandle.api,所以CMD命令窗口要退回到Z:\project\work_workspace\spidhandle\src目錄
然后在CMD窗口中執(zhí)行
Java代碼

- javah com.spidHandle.api.SpidHandle
執(zhí)行后在Z:\project\work_workspace\spidhandle\src目錄下生成文件
com_spidHandle_api_SpidHandle.h文件。
安裝VC6.0開發(fā)工具。如果你是在windows下開發(fā),那可以先生成DLL,這樣你就可以在Windows下調(diào)試。其實(shí)JNI調(diào)用DLL和SO是一樣的,只是運(yùn)行的操作系統(tǒng)不一樣而已。下面是如何用VC6.0創(chuàng)建一個(gè)DLL項(xiàng)目。
創(chuàng)建一個(gè)項(xiàng)目工程,名為spidhandle的工程,創(chuàng)建過程如下:
1、打開VC6.0->文件->新建
2、在彈出窗口中的工程選項(xiàng)卡中選擇Win32 Dynamic-Link Library;工程名命名為spidhandle;點(diǎn)擊確定。
3、在新的提示窗口中選擇一個(gè)空白的DLL工程,點(diǎn)擊完成。
4、在菜單的工具欄中選擇選項(xiàng),彈出選項(xiàng)窗口。切換到目錄選項(xiàng)卡
5、在目錄選項(xiàng)卡中新建目錄,新建的目錄為你JDK所在的目錄下的include目錄,如:
D:\Program Files\Java\jdk1.6.0_16\include
再新建一個(gè)目錄,新建的目錄為include文件夾下的win32目錄,如
D:\Program Files\Java\jdk1.6.0_16\include\win32
此步主要是向工程引入jni所需要的頭文件,如include中包含了jni.h,jni_md.h
6、將com_spidHandle_api_SpidHandle.h頭文件拷貝到vc6.0工程spidHandle根目錄下,將其添加到工 程的Header Files,右鍵工程窗口中的Header Files,選擇添加文件到目錄下,選擇工程路徑下的com_spidHandle_api_SpidHandle.h文件。
7、在spidHandle工程根目錄的文件夾中新建com_spidHandle_api_SpidHandle.h頭文件對(duì)應(yīng)的cpp文件, 文件名稱為com_spidHandle_api_SpidHandle.cpp,然后返回VC6.0操作界面,將其添加到工程的Source Files,右鍵工程窗口中的Source Files,選擇添加文件到目錄下,選擇工程路徑下的com_spidHandle_api_SpidHandle.cpp文件。
Java代碼

- #include "com_spidHandle_api_SpidHandle.h"
- #include <string.h>
-
- #include "MD5.h"
-
- const static char* version = "1201.01";
-
- JNIEXPORT jstring JNICALL Java_com_spidHandle_api_SpidHandle_getSPID
- (JNIEnv *env , jobject obj, jstring path, jstring login_name, jstring password, jstring key)
- {
- printf("-= com_spidHandle_api_SpidHandle Version %s =- \n", version);
- char icpid[256];
- const char * md5="A6EIo8tuaKS";
-
- const char* login_user = env->GetStringUTFChars(login_name, false);
- const char* login_pwd = env->GetStringUTFChars(password, false);
- const char* md5_key = env->GetStringUTFChars(key, false);
- const char* path_str = env->GetStringUTFChars(path, false);
-
- memset(icpid, 0, 256);
-
- printf("login_user = %s\n", login_user);
- printf("path = %s\n", path_str);
- printf("login_pwd = %s\n", login_pwd);
- printf("md5_key = %s\n", md5_key);
-
- // 不管播放哪個(gè)url 直接用這個(gè)加密 -_-||
- // pPath = "tmes_224";
- // 組建加密部分
- char *p=icpid;
- *p=strlen(login_user);
- p++;
- strcpy(p,login_user);
- p+=strlen(login_user);
- *p=strlen(path_str);
- p++;
- strcpy(p,path_str);
- p+=strlen(path_str);
-
- if(strlen(md5_key) > 1)
- md5 = md5_key;
- *p=strlen(md5);
- p++;
- strcpy(p,md5);
- p+=strlen(md5);
-
- MD5 m1;
- m1 << md5 << login_user << login_pwd;
-
- const char *pmd5 = m1.HexDigest(); // symbian專用
- char md5buf[256];
- memset(md5buf,0,256);
- memcpy( md5buf,pmd5,strlen(pmd5) ); // 結(jié)束symbian專用
-
- printf("md5buf = %s\n", md5buf);
-
- int pmd5_len = strlen(pmd5);
-
- *p=strlen(md5buf);
- p++;
- strcpy(p,md5buf);
- p+=strlen(md5buf);
-
- printf("spid = %s\n", icpid);
-
- return env->NewStringUTF(icpid);
- }
8、將MD5.h,MD5.cpp拷貝到工程目錄下,即跟com_spidHandle_api_SpidHandle.h文件同在項(xiàng)目根目錄下。這兩個(gè)文件其實(shí)是我用到的加密類。不是VC自有的,是另外同事開發(fā)的。
9、在VC6.0的菜單欄中選擇組建;在工程文件夾下的Debug文件夾中生成spidHandle.dll
10、可以將spidHandle.dll拷貝到JAVA PROJECT的spidHandle的項(xiàng)目里,放在項(xiàng)目的根目錄,即Z:\project\work_workspace\spidhandle目錄 下,用eclispe運(yùn)行SpidHandle.java文件。在輸出窗口中會(huì)打印com_spidHandle_api_SpidHandle.cpp
的printf輸出部分。
生成so文件,此步需要在linux上操作。
1、將com_spidHandle_api_SpidHandle.h, MD5.h,com_spidHandle_api_SpidHandle.cpp,MD5.cpp文件拷貝到linux下,如拷貝到/home/spidHandle目錄中去;
2、在linux下,命令切換到spidHandle文件夾下,執(zhí)行:
g++ com_spidHandle_api_SpidHandle.cpp MD5.cpp -I/usr/java/jdk1.6.0_16/include -I/usr/java/jdk1.6.0_16/include/linux -fPIC -shared -o libspidhandle.so
命令。其中-I/usr/java/jdk1.6.0_16/include
-I/usr/java/jdk1.6.0_16/include/linux 表示需要引入的頭文件。相當(dāng)于生成DLL引入了jni.h等文件。-fPIC表示生成共享庫文件,libspidhandle.so表示庫文件名。
3、執(zhí)行export LD_LIBRARY_PATH=/home/spidHandle
此步是設(shè)置將庫文件所在路徑加入LD_LIBRARY_PATH中去,如果不執(zhí)行此步,在運(yùn)行中就會(huì)出現(xiàn)異常:
Java代碼

- java.lang.UnsatisfiedLinkError: no XXX in java.library.path
4、可以在Linux中部署一個(gè)簡(jiǎn)單的web 應(yīng)用,如一個(gè)簡(jiǎn)單的test項(xiàng)目,在servlet中調(diào)用該so,調(diào)用代碼如下:
Java代碼

- String spid = new SpidHandle().buildSpID(pathforMD5, user,pwd,keyforMD5);
spid為加密后返回的結(jié)果。
補(bǔ)充:
過程中所碰到的問題:
問題1
java.lang.UnsatisfiedLinkError: /home/spidhandle/libspidhandle.so: /home/spidhandle/libspidhandle.so: wrong ELF class: ELFCLASS64 (Possible cause: architecture word width mismatch)
在linux中,用servlet調(diào)用該so,出現(xiàn)上面的異常,主要因?yàn)槲宜渴饝?yīng)用的linux服務(wù)器是64位的,而所生成的so是32位的,后來將項(xiàng)目部署到32位的服務(wù)器上就解決問題了。
如何查看linux操作系統(tǒng)是32位還是64位的,可以運(yùn)行下面命令:
查看操作系統(tǒng)位數(shù)
Java代碼

- file /bin/ls
問題2
運(yùn)行servlet,JVM崩潰,并輸出JVM異常,異常文件在tomcat啟動(dòng)文件startup.sh同個(gè)目錄下,如tomcat/bin下,文件格式為hs_err_pid*.log 如,hs_err_pid23600.log
錯(cuò)誤日志內(nèi)容:
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0xb6e5a1ef, pid=23600, tid=2431036272
#
# JRE version: 6.0_16-b01
# Java VM: Java HotSpot(TM) Server VM (14.2-b01 mixed mode linux-x86 )
# Problematic frame:
# V [libjvm.so+0x3931ef]
#
# 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 (0x085bbc00): JavaThread "http-8080-1" daemon [_thread_in_vm, id=23622, stack(0x90e1a000,0x90e6b000)]
siginfo:si_signo=SIGSEGV: si_errno=0, si_code=1 (SEGV_MAPERR), si_addr=0x00000000
Registers:
EAX=0x00000000, EBX=0xb71dd7c0, ECX=0xb71f87e0, EDX=0x00000ffc
ESP=0x90e696d4, EBP=0x90e69748, ESI=0x0825b0a8, EDI=0x00090e69
EIP=0xb6e5a1ef, CR2=0x00000000, EFLAGS=0x00010296
Top of Stack: (sp=0x90e696d4)
0x90e696d4: b71d5ec8 00000000 b6e5a127 b7783a30
0x90e696e4: b77624c0 00000000 90e69700 0825b0a8
0x90e696f4: 080de058 080de060 080de44c 085bbc00
0x90e69704: 00000000 b77d8ff4 9106c730 085bbc00
0x90e69714: 90e69750 b77c7f56 9106c8e8 085bbc00
0x90e69724: 00000001 00000005 00000000 90dd6601
0x90e69734: 90dd6000 00004044 90dd9ff4 927ec5f4
0x90e69744: 085bbc00 90e69768 90dd6fbd 085bbd10
Instructions: (pc=0xb6e5a1ef)
0xb6e5a1df: ac 8b 46 08 89 45 b0 8b 46 0c 89 45 b4 8b 45 0c
0xb6e5a1ef: 8b 00 50 e8 09 ae fd ff 83 ec 0c 89 c7 50 e8 aa
Stack: [0x90e1a000,0x90e6b000], sp=0x90e696d4, free space=317k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V [libjvm.so+0x3931ef]
C [libspidhandle.so+0xfbd] _ZN7JNIEnv_17GetStringUTFCharsEP8_jstringPh+0x27
C [libspidhandle.so+0xc6e] Java_com_spidHandle_api_SpidHandle_getSPID+0x52
j com.spidHandle.api.SpidHandle.getSPID(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;+0
j com.spidHandle.api.SpidHandle.buildSpID(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;+6
j com.play.servlet.PlayServlet.service(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+1044
j org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+376
j org.apache.catalina.core.ApplicationFilterChain.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+101
j org.apache.catalina.core.StandardWrapperValve.invoke(Lorg/apache/catalina/connector/Request;Lorg/apache/catalina/connector/Response;)V+804
j org.apache.catalina.core.StandardContextValve.invoke(Lorg/apache/catalina/connector/Request;Lorg/apache/catalina/connector/Response;)V+365
j org.apache.catalina.core.StandardHostValve.invoke(Lorg/apache/catalina/connector/Request;Lorg/apache/catalina/connector/Response;)V+64
j org.apache.catalina.valves.ErrorReportValve.invoke(Lorg/apache/catalina/connector/Request;Lorg/apache/catalina/connector/Response;)V+6
j org.apache.catalina.core.StandardEngineValve.invoke(Lorg/apache/catalina/connector/Request;Lorg/apache/catalina/connector/Response;)V+42
j org.apache.catalina.connector.CoyoteAdapter.service(Lorg/apache/coyote/Request;Lorg/apache/coyote/Response;)V+158
j org.apache.coyote.http11.Http11Processor.process(Ljava/net/Socket;)V+514
j org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Ljava/net/Socket;)Z+82
j org.apache.tomcat.util.net.JIoEndpoint$Worker.run()V+41
j java.lang.Thread.run()V+11
v ~StubRoutines::call_stub
V [libjvm.so+0x36ca20]
V [libjvm.so+0x530828]
V [libjvm.so+0x36c227]
V [libjvm.so+0x36c2da]
V [libjvm.so+0x3e95f5]
V [libjvm.so+0x61097e]
V [libjvm.so+0x531cce]
C [libpthread.so.0+0x6725]
Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j com.spidHandle.api.SpidHandle.getSPID(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;+0
j com.spidHandle.api.SpidHandle.buildSpID(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;+6
j com.play.servlet.PlayServlet.service(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+1044
j org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+376
j org.apache.catalina.core.ApplicationFilterChain.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+101
j org.apache.catalina.core.StandardWrapperValve.invoke(Lorg/apache/catalina/connector/Request;Lorg/apache/catalina/connector/Response;)V+804
j org.apache.catalina.core.StandardContextValve.invoke(Lorg/apache/catalina/connector/Request;Lorg/apache/catalina/connector/Response;)V+365
j org.apache.catalina.core.StandardHostValve.invoke(Lorg/apache/catalina/connector/Request;Lorg/apache/catalina/connector/Response;)V+64
j org.apache.catalina.valves.ErrorReportValve.invoke(Lorg/apache/catalina/connector/Request;Lorg/apache/catalina/connector/Response;)V+6
j org.apache.catalina.core.StandardEngineValve.invoke(Lorg/apache/catalina/connector/Request;Lorg/apache/catalina/connector/Response;)V+42
j org.apache.catalina.connector.CoyoteAdapter.service(Lorg/apache/coyote/Request;Lorg/apache/coyote/Response;)V+158
j org.apache.coyote.http11.Http11Processor.process(Ljava/net/Socket;)V+514
j org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Ljava/net/Socket;)Z+82
j org.apache.tomcat.util.net.JIoEndpoint$Worker.run()V+41
j java.lang.Thread.run()V+11
v ~StubRoutines::call_stub
--------------- P R O C E S S ---------------
Java Threads: ( => current thread )
=>0x085bbc00 JavaThread "http-8080-1" daemon [_thread_in_vm, id=23622, stack(0x90e1a000,0x90e6b000)]
0x912ecc00 JavaThread "TP-Monitor" daemon [_thread_blocked, id=23619, stack(0x90e6b000,0x90ebc000)]
0x91069c00 JavaThread "TP-Processor4" daemon [_thread_in_native, id=23618, stack(0x90ebc000,0x90f0d000)]
0x9105f400 JavaThread "TP-Processor3" daemon [_thread_blocked, id=23617, stack(0x90f0d000,0x90f5e000)]
0x9102f800 JavaThread "TP-Processor2" daemon [_thread_blocked, id=23616, stack(0x90f5e000,0x90faf000)]
0x912ea400 JavaThread "TP-Processor1" daemon [_thread_blocked, id=23615, stack(0x90faf000,0x91000000)]
0x912da000 JavaThread "http-8080-Acceptor-0" daemon [_thread_in_native, id=23614, stack(0x9113c000,0x9118d000)]
0x91036000 JavaThread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" daemon [_thread_blocked, id=23613, stack(0x9118d000,0x911de000)]
0x912ac400 JavaThread "GC Daemon" daemon [_thread_blocked, id=23612, stack(0x91305000,0x91356000)]
0x91615c00 JavaThread "Low Memory Detector" daemon [_thread_blocked, id=23610, stack(0x9141d000,0x9146e000)]
0x91613c00 JavaThread "CompilerThread1" daemon [_thread_blocked, id=23609, stack(0x9146e000,0x914ef000)]
0x91612000 JavaThread "CompilerThread0" daemon [_thread_blocked, id=23608, stack(0x914ef000,0x91570000)]
0x91610800 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=23607, stack(0x91570000,0x915c1000)]
0x91600800 JavaThread "Finalizer" daemon [_thread_blocked, id=23606, stack(0x9170f000,0x91760000)]
0x080d8400 JavaThread "Reference Handler" daemon [_thread_blocked, id=23605, stack(0x91760000,0x917b1000)]
0x08058400 JavaThread "main" [_thread_in_native, id=23601, stack(0xb6a4e000,0xb6a9f000)]
Other Threads:
0x080d4400 VMThread [stack: 0x917b1000,0x91832000] [id=23604]
0x91617800 WatcherThread [stack: 0x9139c000,0x9141d000] [id=23611]
VM state:not at safepoint (normal execution)
VM Mutex/Monitor currently owned by a thread: None
Heap
PSYoungGen total 24448K, used 339K [0xb0420000, 0xb1da0000, 0xb3900000)
eden space 23168K, 1% used [0xb0420000,0xb0474cf8,0xb1ac0000)
from space 1280K, 0% used [0xb1c20000,0xb1c20000,0xb1d60000)
to space 1408K, 0% used [0xb1ac0000,0xb1ac0000,0xb1c20000)
PSOldGen total 27072K, used 8597K [0x95d00000, 0x97770000, 0xb0420000)
object space 27072K, 31% used [0x95d00000,0x96565510,0x97770000)
PSPermGen total 19200K, used 11186K [0x91d00000, 0x92fc0000, 0x95d00000)
object space 19200K, 58% used [0x91d00000,0x927ec980,0x92fc0000)
Dynamic libraries:
08048000-08052000 r-xp 00000000 08:03 5775425 /usr/java/jdk1.6.0_16/bin/java
08052000-08053000 rwxp 00009000 08:03 5775425 /usr/java/jdk1.6.0_16/bin/java
08053000-08c64000 rwxp 00000000 00:00 0 [heap]
90cac000-90cb9000 r-xp 00000000 08:03 28295296 /lib/libgcc_s.so.1
90cb9000-90cba000 r-xp 0000c000 08:03 28295296 /lib/libgcc_s.so.1
90cba000-90cbb000 rwxp 0000d000 08:03 28295296 /lib/libgcc_s.so.1
90cbb000-90da3000 r-xp 00000000 08:03 5337022 /usr/lib/libstdc++.so.6.0.10
90da3000-90da7000 r-xp 000e7000 08:03 5337022 /usr/lib/libstdc++.so.6.0.10
90da7000-90da8000 rwxp 000eb000 08:03 5337022 /usr/lib/libstdc++.so.6.0.10
90da8000-90dae000 rwxp 00000000 00:00 0
90dd6000-90dd9000 r-xp 00000000 08:03 27729947 /home/play/lib/libspidhandle.so
90dd9000-90dda000 r-xp 00002000 08:03 27729947 /home/play/lib/libspidhandle.so
90dda000-90ddb000 rwxp 00003000 08:03 27729947 /home/play/lib/libspidhandle.so
90ddb000-90ddc000 r-xs 0000e000 08:03 5808917 /usr/apache-tomcat-6.0.32/webapps/play/WEB-INF/lib/spidhandle.jar
90ddc000-90ddd000 r-xs 00001000 08:03 5808916 /usr/apache-tomcat-6.0.32/webapps/play/WEB-INF/lib/slf4j-simple-1.5.8.jar
90ddd000-90ddf000 r-xs 00004000 08:03 5808915 /usr/apache-tomcat-6.0.32/webapps/play/WEB-INF/lib/slf4j-api-1.5.6.jar
90ddf000-90de5000 r-xs 00035000 08:03 5808914 /usr/apache-tomcat-6.0.32/webapps/play/WEB-INF/lib/logback-core-0.9.15.jar
90de5000-90dea000 r-xs 00023000 08:03 5808913 /usr/apache-tomcat-6.0.32/webapps/play/WEB-INF/lib/logback-classic-0.9.15.jar
90dea000-90df1000 r-xs 00059000 08:03 5808912 /usr/apache-tomcat-6.0.32/webapps/play/WEB-INF/lib/log4j-1.2.15.jar
90df1000-90dfd000 r-xs 000a2000 08:03 5808911 /usr/apache-tomcat-6.0.32/webapps/play/WEB-INF/lib/jxl.jar
90dfd000-90e07000 r-xs 0005c000 08:03 5808910 /usr/apache-tomcat-6.0.32/webapps/play/WEB-INF/lib/jstl-1.2.jar
90e07000-90e1a000 r-xs 00114000 08:03 5808909 /usr/apache-tomcat-6.0.32/webapps/play/WEB-INF/lib/jsf-impl.jar
90e1a000-90e1d000 ---p 00000000 00:00 0
90e1d000-90e6b000 rwxp 00000000 00:00 0 [threadstack:0004d494]
90e6b000-90e6e000 ---p 00000000 00:00 0
90e6e000-90ebc000 rwxp 00000000 00:00 0
90ebc000-90ebf000 ---p 00000000 00:00 0
90ebf000-90f0d000 rwxp 00000000 00:00 0
90f0d000-90f10000 ---p 00000000 00:00 0
90f10000-90f5e000 rwxp 00000000 00:00 0
90f5e000-90f61000 ---p 00000000 00:00 0
90f61000-90faf000 rwxp 00000000 00:00 0
90faf000-90fb2000 ---p 00000000 00:00 0
90fb2000-91000000 rwxp 00000000 00:00 0
91000000-910b3000 rwxp 00000000 00:00 0
910b3000-91100000 ---p 00000000 00:00 0
91100000-91105000 r-xs 0004a000 08:03 5808908 /usr/apache-tomcat-6.0.32/webapps/play/WEB-INF/lib/jsf-api.jar
91105000-91107000 r-xs 0000d000 08:03 5808907 /usr/apache-tomcat-6.0.32/webapps/play/WEB-INF/lib/commons-logging-1.1.1.jar
91107000-9113c000 r-xs 00000000 08:03 20439789 /var/run/nscd/dbl5FOXp (deleted)
9113c000-9113f000 ---p 00000000 00:00 0
9113f000-9118d000 rwxp 00000000 00:00 0
9118d000-91190000 ---p 00000000 00:00 0
91190000-911de000 rwxp 00000000 00:00 0
911de000-911f1000 r-xp 00000000 08:03 5784005 /usr/java/jdk1.6.0_16/jre/lib/i386/libnet.so
911f1000-911f2000 rwxp 00013000 08:03 5784005 /usr/java/jdk1.6.0_16/jre/lib/i386/libnet.so
911f2000-911f5000 r-xs 00027000 08:03 5783936 /usr/java/jdk1.6.0_16/jre/lib/ext/sunjce_provider.jar
911f5000-911fc000 r-xs 00091000 08:03 5784036 /usr/java/jdk1.6.0_16/jre/lib/jsse.jar
911fc000-91200000 r-xs 00035000 08:03 5783937 /usr/java/jdk1.6.0_16/jre/lib/ext/sunpkcs11.jar
91200000-912f8000 rwxp 00000000 00:00 0
912f8000-91300000 ---p 00000000 00:00 0
91300000-91302000 r-xs 0000a000 08:03 5808906 /usr/apache-tomcat-6.0.32/webapps/play/WEB-INF/lib/commons-codec-1.3.jar
91302000-91305000 r-xs 00013000 08:03 5784024 /usr/java/jdk1.6.0_16/jre/lib/jce.jar
91305000-91308000 ---p 00000000 00:00 0
91308000-91356000 rwxp 00000000 00:00 0
91356000-91359000 r-xs 000cb000 08:03 5783821 /usr/java/jdk1.6.0_16/jre/lib/ext/localedata.jar
91359000-9135d000 r-xs 00036000 08:03 5808320 /usr/apache-tomcat-6.0.32/lib/catalina-tribes.jar
9135d000-91360000 r-xs 0000f000 08:03 5808331 /usr/apache-tomcat-6.0.32/lib/tomcat-i18n-es.jar
91360000-9136a000 r-xs 000b1000 08:03 5808329 /usr/apache-tomcat-6.0.32/lib/tomcat-coyote.jar
9136a000-91371000 r-xs 0007a000 08:03 5808325 /usr/apache-tomcat-6.0.32/lib/jasper.jar
91371000-91380000 r-xs 0011a000 08:03 5808321 /usr/apache-tomcat-6.0.32/lib/catalina.jar
91380000-91382000 r-xs 0001e000 08:03 5808319 /usr/apache-tomcat-6.0.32/lib/catalina-ha.jar
91382000-91386000 r-xs 0003a000 08:03 5808330 /usr/apache-tomcat-6.0.32/lib/tomcat-dbcp.jar
91386000-91388000 r-xs 0000c000 08:03 5808318 /usr/apache-tomcat-6.0.32/lib/catalina-ant.jar
91388000-9138a000 r-xs 00007000 08:03 5808323 /usr/apache-tomcat-6.0.32/lib/el-api.jar
9138a000-9138c000 r-xs 00014000 08:03 5808328 /usr/apache-tomcat-6.0.32/lib/servlet-api.jar
9138c000-9139a000 r-xs 00170000 08:03 5808322 /usr/apache-tomcat-6.0.32/lib/ecj-3.3.1.jar
9139a000-9139c000 r-xs 0000c000 08:03 5808333 /usr/apache-tomcat-6.0.32/lib/tomcat-i18n-ja.jar
9139c000-9139d000 ---p 00000000 00:00 0
9139d000-9141d000 rwxp 00000000 00:00 0
9141d000-91420000 ---p 00000000 00:00 0
91420000-9146e000 rwxp 00000000 00:00 0
9146e000-91471000 ---p 00000000 00:00 0
91471000-914ef000 rwxp 00000000 00:00 0
914ef000-914f2000 ---p 00000000 00:00 0
914f2000-91570000 rwxp 00000000 00:00 0
91570000-91573000 ---p 00000000 00:00 0
91573000-915c1000 rwxp 00000000 00:00 0
915c1000-91600000 r-xp 00000000 08:03 5546089 /usr/lib/locale/en_US.utf8/LC_CTYPE
91600000-916ff000 rwxp 00000000 00:00 0
916ff000-91700000 ---p 00000000 00:00 0
91700000-91701000 rwxp 00000000 00:00 0
91701000-91703000 r-xs 00011000 08:03 5808326 /usr/apache-tomcat-6.0.32/lib/jsp-api.jar
91703000-91705000 r-xs 0000b000 08:03 5808332 /usr/apache-tomcat-6.0.32/lib/tomcat-i18n-fr.jar
91705000-91708000 r-xs 00019000 08:03 5808324 /usr/apache-tomcat-6.0.32/lib/jasper-el.jar
91708000-9170e000 r-xp 00000000 08:03 5784001 /usr/java/jdk1.6.0_16/jre/lib/i386/libmanagement.so
9170e000-9170f000 rwxp 00005000 08:03 5784001 /usr/java/jdk1.6.0_16/jre/lib/i386/libmanagement.so
9170f000-91712000 ---p 00000000 00:00 0
91712000-91760000 rwxp 00000000 00:00 0
91760000-91763000 ---p 00000000 00:00 0
91763000-917b1000 rwxp 00000000 00:00 0
917b1000-917b2000 ---p 00000000 00:00 0
917b2000-91865000 rwxp 00000000 00:00 0
91865000-919fb000 r-xs 02fb3000 08:03 5784038 /usr/java/jdk1.6.0_16/jre/lib/rt.jar
919fb000-919fc000 ---p 00000000 00:00 0
919fc000-91a7c000 rwxp 00000000 00:00 0
91a7c000-91a7d000 ---p 00000000 00:00 0
91a7d000-91b07000 rwxp 00000000 00:00 0
91b07000-91b1d000 rwxp 00000000 00:00 0
91b1d000-91b2b000 rwxp 00000000 00:00 0
91b2b000-91bf1000 rwxp 00000000 00:00 0
91bf1000-91bfb000 rwxp 00000000 00:00 0
91bfb000-91c11000 rwxp 00000000 00:00 0
91c11000-91c1f000 rwxp 00000000 00:00 0
91c1f000-91ce4000 rwxp 00000000 00:00 0
91ce4000-91cf2000 rwxp 00000000 00:00 0
91cf2000-91cff000 rwxp 00000000 00:00 0
91cff000-92fc0000 rwxp 00000000 00:00 0
92fc0000-95d00000 rwxp 00000000 00:00 0
95d00000-97770000 rwxp 00000000 00:00 0
97770000-b0420000 rwxp 00000000 00:00 0
b0420000-b1da0000 rwxp 00000000 00:00 0
b1da0000-b3900000 rwxp 00000000 00:00 0
b3900000-b3901000 r-xs 00003000 08:03 5808317 /usr/apache-tomcat-6.0.32/lib/annotations-api.jar
b3901000-b3902000 r-xs 00006000 08:03 5808298 /usr/apache-tomcat-6.0.32/bin/tomcat-juli.jar
b3902000-b3903000 r-xs 00005000 08:03 5808288 /usr/apache-tomcat-6.0.32/bin/commons-daemon.jar
b3903000-b390a000 r-xs 00000000 08:03 5523095 /usr/lib/gconv/gconv-modules.cache
b390a000-b3913000 rwxp 00000000 00:00 0
b3913000-b39ca000 rwxp 00000000 00:00 0
b39ca000-b3c0a000 rwxp 00000000 00:00 0
b3c0a000-b69ca000 rwxp 00000000 00:00 0
b69ca000-b69d9000 r-xp 00000000 08:03 5784014 /usr/java/jdk1.6.0_16/jre/lib/i386/libzip.so
b69d9000-b69db000 rwxp 0000e000 08:03 5784014 /usr/java/jdk1.6.0_16/jre/lib/i386/libzip.so
b69db000-b69e3000 rwxs 00000000 08:03 6743707 /tmp/hsperfdata_root/23600
b69e3000-b6a18000 r-xs 00000000 08:03 20439787 /var/run/nscd/passwd
b6a18000-b6a1e000 r-xp 00000000 08:03 5784018 /usr/java/jdk1.6.0_16/jre/lib/i386/native_threads/libhpi.so
b6a1e000-b6a1f000 rwxp 00006000 08:03 5784018 /usr/java/jdk1.6.0_16/jre/lib/i386/native_threads/libhpi.so
b6a1f000-b6a42000 r-xp 00000000 08:03 5783990 /usr/java/jdk1.6.0_16/jre/lib/i386/libjava.so
b6a42000-b6a44000 rwxp 00023000 08:03 5783990 /usr/java/jdk1.6.0_16/jre/lib/i386/libjava.so
b6a44000-b6a4c000 r-xp 00000000 08:03 28295217 /lib/librt-2.11.1.so
b6a4c000-b6a4d000 r-xp 00007000 08:03 28295217 /lib/librt-2.11.1.so
b6a4d000-b6a4e000 rwxp 00008000 08:03 28295217 /lib/librt-2.11.1.so
b6a4e000-b6a51000 ---p 00000000 00:00 0
b6a51000-b6a9f000 rwxp 00000000 00:00 0
b6a9f000-b6ac5000 r-xp 00000000 08:03 28295195 /lib/libm-2.11.1.so
b6ac5000-b6ac6000 r-xp 00026000 08:03 28295195 /lib/libm-2.11.1.so
b6ac6000-b6ac7000 rwxp 00027000 08:03 28295195 /lib/libm-2.11.1.so
b6ac7000-b7194000 r-xp 00000000 08:03 5784022 /usr/java/jdk1.6.0_16/jre/lib/i386/server/libjvm.so
b7194000-b71e2000 rwxp 006cc000 08:03 5784022 /usr/java/jdk1.6.0_16/jre/lib/i386/server/libjvm.so
b71e2000-b7605000 rwxp 00000000 00:00 0
b7605000-b7760000 r-xp 00000000 08:03 28295187 /lib/libc-2.11.1.so
b7760000-b7762000 r-xp 0015b000 08:03 28295187 /lib/libc-2.11.1.so
b7762000-b7763000 rwxp 0015d000 08:03 28295187 /lib/libc-2.11.1.so
b7763000-b7767000 rwxp 00000000 00:00 0
b7767000-b776a000 r-xp 00000000 08:03 28295193 /lib/libdl-2.11.1.so
b776a000-b776b000 r-xp 00002000 08:03 28295193 /lib/libdl-2.11.1.so
b776b000-b776c000 rwxp 00003000 08:03 28295193 /lib/libdl-2.11.1.so
b776c000-b7773000 r-xp 00000000 08:03 5783973 /usr/java/jdk1.6.0_16/jre/lib/i386/jli/libjli.so
b7773000-b7775000 rwxp 00006000 08:03 5783973 /usr/java/jdk1.6.0_16/jre/lib/i386/jli/libjli.so
b7775000-b778c000 r-xp 00000000 08:03 28295213 /lib/libpthread-2.11.1.so
b778c000-b778d000 r-xp 00016000 08:03 28295213 /lib/libpthread-2.11.1.so
b778d000-b778e000 rwxp 00017000 08:03 28295213 /lib/libpthread-2.11.1.so
b778e000-b7790000 rwxp 00000000 00:00 0
b7790000-b7791000 r-xs 00005000 08:03 5808283 /usr/apache-tomcat-6.0.32/bin/bootstrap.jar
b7791000-b7792000 rwxp 00000000 00:00 0
b7792000-b7793000 r-xp 00000000 00:00 0
b7793000-b77a8000 r-xp 00000000 08:03 28295198 /lib/libnsl-2.11.1.so
b77a8000-b77a9000 r-xp 00014000 08:03 28295198 /lib/libnsl-2.11.1.so
b77a9000-b77aa000 rwxp 00015000 08:03 28295198 /lib/libnsl-2.11.1.so
b77aa000-b77ac000 rwxp 00000000 00:00 0
b77ac000-b77b7000 r-xp 00000000 08:03 5784013 /usr/java/jdk1.6.0_16/jre/lib/i386/libverify.so
b77b7000-b77b8000 rwxp 0000b000 08:03 5784013 /usr/java/jdk1.6.0_16/jre/lib/i386/libverify.so
b77b8000-b77b9000 rwxp 00000000 00:00 0
b77b9000-b77d8000 r-xp 00000000 08:03 28295180 /lib/ld-2.11.1.so
b77d8000-b77d9000 r-xp 0001e000 08:03 28295180 /lib/ld-2.11.1.so
b77d9000-b77da000 rwxp 0001f000 08:03 28295180 /lib/ld-2.11.1.so
bfcc6000-bfcdb000 rwxp 00000000 00:00 0 [stack]
ffffe000-fffff000 r-xp 00000000 00:00 0 [vdso]
VM Arguments:
jvm_args: -Djava.util.logging.config.file=/usr/apache-tomcat-6.0.32/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/apache-tomcat-6.0.32/endorsed -Dcatalina.base=/usr/apache-tomcat-6.0.32 -Dcatalina.home=/usr/apache-tomcat-6.0.32 -Djava.io.tmpdir=/usr/apache-tomcat-6.0.32/temp
java_command: org.apache.catalina.startup.Bootstrap start
Launcher Type: SUN_STANDARD
Environment Variables:
JAVA_HOME=/usr/java/jdk1.6.0_16
CLASSPATH=/usr/apache-tomcat-6.0.32/bin/bootstrap.jar
PATH=/sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/usr/lib/mit/bin:/usr/lib/mit/sbin:/usr/java/jdk1.6.0_16/bin:/usr/java/jdk1.6.0_16/jre/bin
LD_LIBRARY_PATH=/usr/java/jdk1.6.0_16/jre/lib/i386/server:/usr/java/jdk1.6.0_16/jre/lib/i386:/usr/java/jdk1.6.0_16/jre/../lib/i386:/home/play/lib
SHELL=/bin/bash
HOSTTYPE=i386
OSTYPE=linux
MACHTYPE=i686-suse-linux
Signal Handlers:
SIGSEGV: [libjvm.so+0x650710], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004
SIGBUS: [libjvm.so+0x650710], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004
SIGFPE: [libjvm.so+0x52f600], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004
SIGPIPE: [libjvm.so+0x52f600], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004
SIGXFSZ: [libjvm.so+0x52f600], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004
SIGILL: [libjvm.so+0x52f600], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004
SIGUSR1: SIG_DFL, sa_mask[0]=0x00000000, sa_flags=0x00000000
SIGUSR2: [libjvm.so+0x5321f0], sa_mask[0]=0x00000000, sa_flags=0x10000004
SIGHUP: [libjvm.so+0x531f20], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004
SIGINT: SIG_IGN, sa_mask[0]=0x00000000, sa_flags=0x00000000
SIGTERM: [libjvm.so+0x531f20], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004
SIGQUIT: [libjvm.so+0x531f20], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004
--------------- S Y S T E M ---------------
OS:SUSE Linux Enterprise Server 11 (i586)
VERSION = 11
PATCHLEVEL = 1
uname:Linux 2.6.32.12-0.7-pae #1 SMP 2010-05-20 11:14:20 +0200 i686
libc:glibc 2.11.1 NPTL 2.11.1
rlimit: STACK 8192k, CORE 1k, NPROC 15118, NOFILE 8192, AS 3192000k
load average:0.00 0.04 0.05
CPU:total 2 (2 cores per cpu, 1 threads per core) family 6 model 23 stepping 10, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3
Memory: 4k page, physical 1941704k(213752k free), swap 2048276k(1540564k free)
vm_info: Java HotSpot(TM) Server VM (14.2-b01) for linux-x86 JRE (1.6.0_16-b01), built on Jul 31 2009 06:03:51 by "java_re" with gcc 3.2.1-7a (J2SE release)
time: Sat Mar 12 17:13:08 2011
elapsed time: 27 seconds
一開始以為是JVM無法釋放C的對(duì)象,但后來發(fā)現(xiàn)
Java代碼

- Heap
- PSYoungGen total 24448K, used 339K [0xb0420000, 0xb1da0000, 0xb3900000)
- eden space 23168K, 1% used [0xb0420000,0xb0474cf8,0xb1ac0000)
- from space 1280K, 0% used [0xb1c20000,0xb1c20000,0xb1d60000)
- to space 1408K, 0% used [0xb1ac0000,0xb1ac0000,0xb1c20000)
- PSOldGen total 27072K, used 8597K [0x95d00000, 0x97770000, 0xb0420000)
- object space 27072K, 31% used [0x95d00000,0x96565510,0x97770000)
- PSPermGen total 19200K, used 11186K [0x91d00000, 0x92fc0000, 0x95d00000)
- object space 19200K, 58% used [0x91d00000,0x927ec980,0x92fc0000)
并沒有出現(xiàn)堆棧縊出的現(xiàn)象,所以排除該原因。
查閱 文檔:
JavaTM 2 Platform, Standard Edition 5.0
Troubleshooting and Diagnostic Guide
文檔中提到:
If you get a crash in a native application library (like the above examples) then you may be able to
attach the native debugger (dbx, gdb, windbg depending on the operating system) to the core file/crash
dump if it is available. Another approach is run with the -Xcheck:jni option added to the command
line (section 1.17.3). The -Xcheck:jni option is not guaranteed to find all issues with JNI code but it
can help identify a significant number of issues.
解決方法:
啟動(dòng)JVM時(shí)增加啟動(dòng)參數(shù) -Xcheck:jni
日志中輸出JNI的錯(cuò)誤日志:
Java代碼

- FATAL ERROR in native method: JNI string operation received a non-string
- at com.spidHandle.api.SpidHandle.getSPID(Native Method)
- at com.spidHandle.api.SpidHandle.buildSpID(SpidHandle.java:12)
- at com.play.servlet.PlayServlet.service(PlayServlet.java:190)
- at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
- at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
- at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
- at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
- at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
- at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
- at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
- at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
- at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:861)
- at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
- at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1584)
- at java.lang.Thread.run(Thread.java:619)
JVM崩潰的原因找到了.是由于傳入C方法體中某個(gè)參數(shù)值為NULL,如buildSpID(String path, String login_name, String password, String key)中l(wèi)ogin_name為NULL,導(dǎo)致傳遞給C程序的參數(shù)為NULL.NULL值傳遞給C,C不能識(shí)別他為字符串,所以JVM崩潰.
今天客戶發(fā)過來一個(gè)新的jar包B.jar,讓我替換原來的進(jìn)行測(cè)試,但是替換完畢執(zhí)行后,出現(xiàn)如下錯(cuò)誤:
但是目前做的一個(gè)小產(chǎn)品,只有兩個(gè)jar包,A.jar和前文提到的B.jar,沒有引入第三方包。我仔細(xì)查了一下兩個(gè)jar包,不存在相同類名的情況。
最后發(fā)現(xiàn)這個(gè)問題很多時(shí)候和數(shù)字簽名這個(gè)關(guān)鍵字一起出現(xiàn)。然后仔細(xì)檢查,發(fā)現(xiàn)新的B.jar里面忘記加數(shù)字簽名了。
出于簡(jiǎn)易性或可伸縮性的考慮,您可能傾向于使用 volatile 變量而不是鎖。當(dāng)使用 volatile
變量而非鎖時(shí),某些習(xí)慣用法(idiom)更加易于編碼和閱讀。此外,volatile
變量不會(huì)像鎖那樣造成線程阻塞,因此也很少造成可伸縮性問題。在某些情況下,如果讀操作遠(yuǎn)遠(yuǎn)大于寫操作,volatile
變量還可以提供優(yōu)于鎖的性能優(yōu)勢(shì)。
實(shí)際上,這些條件表明,可以被寫入 volatile 變量的這些有效值獨(dú)立于任何程序的狀態(tài),包括變量的當(dāng)前狀態(tài)。
使用 volatile 變量的主要原因是其簡(jiǎn)易性:在某些情形下,使用 volatile 變量要比使用相應(yīng)的鎖簡(jiǎn)單得多。使用 volatile 變量次要原因是其性能:某些情況下,volatile 變量同步機(jī)制的性能要優(yōu)于鎖。
很難做出準(zhǔn)確、全面的評(píng)價(jià),例如 “X 總是比 Y 快”,尤其是對(duì) JVM 內(nèi)在的操作而言。(例如,某些情況下 VM 也許能夠完全刪除鎖機(jī)制,這使得我們難以抽象地比較 volatile
和 synchronized
的開銷。)就是說,在目前大多數(shù)的處理器架構(gòu)上,volatile 讀操作開銷非常低 ——
幾乎和非 volatile 讀操作一樣。而 volatile 寫操作的開銷要比非 volatile
寫操作多很多,因?yàn)橐WC可見性需要實(shí)現(xiàn)內(nèi)存界定(Memory Fence),即便如此,volatile 的總開銷仍然要比鎖獲取低。
volatile 操作不會(huì)像鎖一樣造成阻塞,因此,在能夠安全使用 volatile 的情況下,volatile 可以提供一些優(yōu)于鎖的可伸縮特性。如果讀操作的次數(shù)要遠(yuǎn)遠(yuǎn)超過寫操作,與鎖相比,volatile 變量通常能夠減少同步的性能開銷。
很多并發(fā)性專家事實(shí)上往往引導(dǎo)用戶遠(yuǎn)離 volatile
變量,因?yàn)槭褂盟鼈円仁褂面i更加容易出錯(cuò)。然而,如果謹(jǐn)慎地遵循一些良好定義的模式,就能夠在很多場(chǎng)合內(nèi)安全地使用 volatile
變量。要始終牢記使用 volatile 的限制 —— 只有在狀態(tài)真正獨(dú)立于程序內(nèi)其他內(nèi)容時(shí)才能使用 volatile ——
這條規(guī)則能夠避免將這些模式擴(kuò)展到不安全的用例。
也許實(shí)現(xiàn) volatile 變量的規(guī)范使用僅僅是使用一個(gè)布爾狀態(tài)標(biāo)志,用于指示發(fā)生了一個(gè)重要的一次性事件,例如完成初始化或請(qǐng)求停機(jī)。
很多應(yīng)用程序包含了一種控制結(jié)構(gòu),形式為 “在還沒有準(zhǔn)備好停止程序時(shí)再執(zhí)行一些工作”,如清單 2 所示:
缺乏同步會(huì)導(dǎo)致無法實(shí)現(xiàn)可見性,這使得確定何時(shí)寫入對(duì)象引用而不是原語值變得更加困難。在缺乏同步的情況下,可能會(huì)遇到某個(gè)對(duì)象引用的更新值(由另一個(gè)線
程寫入)和該對(duì)象狀態(tài)的舊值同時(shí)存在。(這就是造成著名的雙重檢查鎖定(double-checked-locking)問題的根源,其中對(duì)象引用在沒有
同步的情況下進(jìn)行讀操作,產(chǎn)生的問題是您可能會(huì)看到一個(gè)更新的引用,但是仍然會(huì)通過該引用看到不完全構(gòu)造的對(duì)象)。
實(shí)現(xiàn)安全發(fā)布對(duì)象的一種技術(shù)就是將對(duì)象引用定義為 volatile 類型。清單 3 展示了一個(gè)示例,其中后臺(tái)線程在啟動(dòng)階段從數(shù)據(jù)庫加載一些數(shù)據(jù)。其他代碼在能夠利用這些數(shù)據(jù)時(shí),在使用之前將檢查這些數(shù)據(jù)是否曾經(jīng)發(fā)布過。
該模式的一個(gè)必要條件是:被發(fā)布的對(duì)象必須是線程安全的,或者是有效的不可變對(duì)象(有效不可變意味著對(duì)象的狀態(tài)在發(fā)布之后永遠(yuǎn)不會(huì)被修改)。volatile 類型的引用可以確保對(duì)象的發(fā)布形式的可見性,但是如果對(duì)象的狀態(tài)在發(fā)布后將發(fā)生更改,那么就需要額外的同步。
安全使用 volatile 的另一種簡(jiǎn)單模式是:定期 “發(fā)布”
觀察結(jié)果供程序內(nèi)部使用。例如,假設(shè)有一種環(huán)境傳感器能夠感覺環(huán)境溫度。一個(gè)后臺(tái)線程可能會(huì)每隔幾秒讀取一次該傳感器,并更新包含當(dāng)前文檔的
volatile 變量。然后,其他線程可以讀取這個(gè)變量,從而隨時(shí)能夠看到最新的溫度值。
使用該模式的另一種應(yīng)用程序就是收集程序的統(tǒng)計(jì)信息。清單 4 展示了身份驗(yàn)證機(jī)制如何記憶最近一次登錄的用戶的名字。將反復(fù)使用 lastUser
引用來發(fā)布值,以供程序的其他部分使用。
該模式是前面模式的擴(kuò)展;將某個(gè)值發(fā)布以在程序內(nèi)的其他地方使用,但是與一次性事件的發(fā)布不同,這是一系列獨(dú)立事件。這個(gè)模式要求被發(fā)布的值是有效不可變的 —— 即值的狀態(tài)在發(fā)布后不會(huì)更改。使用該值的代碼需要清楚該值可能隨時(shí)發(fā)生變化。
volatile bean 模式適用于將 JavaBeans 作為“榮譽(yù)結(jié)構(gòu)”使用的框架。在 volatile bean
模式中,JavaBean 被用作一組具有 getter 和/或 setter 方法 的獨(dú)立屬性的容器。volatile bean
模式的基本原理是:很多框架為易變數(shù)據(jù)的持有者(例如 HttpSession
)提供了容器,但是放入這些容器中的對(duì)象必須是線程安全的。
在 volatile bean 模式中,JavaBean 的所有數(shù)據(jù)成員都是 volatile 類型的,并且 getter 和 setter
方法必須非常普通 ——
除了獲取或設(shè)置相應(yīng)的屬性外,不能包含任何邏輯。此外,對(duì)于對(duì)象引用的數(shù)據(jù)成員,引用的對(duì)象必須是有效不可變的。(這將禁止具有數(shù)組值的屬性,因?yàn)楫?dāng)數(shù)組
引用被聲明為 volatile
時(shí),只有引用而不是數(shù)組本身具有 volatile 語義)。對(duì)于任何 volatile 變量,不變式或約束都不能包含 JavaBean 屬性。清單 5 中的示例展示了遵守 volatile bean 模式的 JavaBean:
前面幾節(jié)介紹的模式涵蓋了大部分的基本用例,在這些模式中使用 volatile 非常有用并且簡(jiǎn)單。這一節(jié)將介紹一種更加高級(jí)的模式,在該模式中,volatile 將提供性能或可伸縮性優(yōu)勢(shì)。
volatile
應(yīng)用的的高級(jí)模式非常脆弱。因此,必須對(duì)假設(shè)的條件仔細(xì)證明,并且這些模式被嚴(yán)格地封裝了起來,因?yàn)榧词狗浅P〉母囊矔?huì)損壞您的代碼!同樣,使用更高級(jí)
的 volatile
用例的原因是它能夠提升性能,確保在開始應(yīng)用高級(jí)模式之前,真正確定需要實(shí)現(xiàn)這種性能獲益。需要對(duì)這些模式進(jìn)行權(quán)衡,放棄可讀性或可維護(hù)性來換取可能的性
能收益 ——
如果您不需要提升性能(或者不能夠通過一個(gè)嚴(yán)格的測(cè)試程序證明您需要它),那么這很可能是一次糟糕的交易,因?yàn)槟芸赡軙?huì)得不償失,換來的東西要比放棄的
東西價(jià)值更低。
然而,如果讀操作遠(yuǎn)遠(yuǎn)超過寫操作,您可以結(jié)合使用內(nèi)部鎖和 volatile 變量來減少公共代碼路徑的開銷。清單 6 中顯示的線程安全的計(jì)數(shù)器使用
synchronized
確保增量操作是原子的,并使用 volatile
保證當(dāng)前結(jié)果的可見性。如果更新不頻繁的話,該方法可實(shí)現(xiàn)更好的性能,因?yàn)樽x路徑的開銷僅僅涉及 volatile 讀操作,這通常要優(yōu)于一個(gè)無競(jìng)爭(zhēng)的鎖獲取的開銷。
之所以將這種技術(shù)稱之為 “開銷較低的讀-寫鎖” 是因?yàn)槟褂昧瞬煌耐綑C(jī)制進(jìn)行讀寫操作。因?yàn)楸纠械膶懖僮鬟`反了使用 volatile
的第一個(gè)條件,因此不能使用 volatile 安全地實(shí)現(xiàn)計(jì)數(shù)器 —— 您必須使用鎖。然而,您可以在讀操作中使用 volatile 確保當(dāng)前值的可見性,
因此可以使用鎖進(jìn)行所有變化的操作,使用 volatile 進(jìn)行只讀操作。其中,鎖一次只允許一個(gè)線程訪問值,volatile
允許多個(gè)線程執(zhí)行讀操作,因此當(dāng)使用 volatile 保證讀代碼路徑時(shí),要比使用鎖執(zhí)行全部代碼路徑獲得更高的共享度 ——
就像讀-寫操作一樣。然而,要隨時(shí)牢記這種模式的弱點(diǎn):如果超越了該模式的最基本應(yīng)用,結(jié)合這兩個(gè)競(jìng)爭(zhēng)的同步機(jī)制將變得非常困難。
與鎖相比,Volatile 變量是一種非常簡(jiǎn)單但同時(shí)又非常脆弱的同步機(jī)制,它在某些情況下將提供優(yōu)于鎖的性能和伸縮性。如果嚴(yán)格遵循 volatile 的使用條件 —— 即變量真正獨(dú)立于其他變量和自己以前的值 —— 在某些情況下可以使用 volatile
代替 synchronized
來簡(jiǎn)化代碼。然而,使用 volatile
的代碼往往比使用鎖的代碼更加容易出錯(cuò)。本文介紹的模式涵蓋了可以使用 volatile
代替 synchronized
的最常見的一些用例。遵循這些模式(注意使用時(shí)不要超過各自的限制)可以幫助您安全地實(shí)現(xiàn)大多數(shù)用例,使用 volatile 變量獲得更佳性能。
java調(diào)用bat,用xcopy拷貝系統(tǒng)日志到指定目錄。如果jdk版本是32位,因?yàn)槲④涀隽讼到y(tǒng)重定向,不能拷貝過去。
將%WinDir%\System32\Winevt\Logs\Application.evtx修改為%WinDir%\Sysnative\Winevt\Logs\Application.evtx,即可實(shí)現(xiàn)。
曾經(jīng)在系統(tǒng)中使用了一個(gè)從網(wǎng)上弄來的可編輯select,根據(jù)需要做了一些修改,在ie6下面運(yùn)行正常。昨晚突然收到領(lǐng)導(dǎo)郵件說不好用。了解完才知道是在ie8下面出問題,每次把鼠標(biāo)放到那個(gè)
I have a problem with ref cursors.I'll try to explain it(sorry if my english is
not very good).
I have 2 databases and i want to return values from one DBto the other.
In the DB that i want to recieve the data i have the call(with a procedure) and
wich the type is REF CURSOR from the second DB. In example:
--where pk1 is a package in which i declare the REF CURSOR variable
..
--where P1 is the procedure in wich i open the cursor and
insert into tbl_probe values (sysdate,'vx',vx);
In the first DB i have in PK_K1 the declaration of the ref cursor, and the
The problem that i have is, that if i make a procedure in the package PK_K1 and
it works, but when i call from the other DB it doesnt work. The error is ERROR
ref cursors cannot be used over a dblink like that.
http://download-east.oracle.com/docs/cd/B19306_01/appdev.102/b14261/sqloperations.htm#sthref1448
....
* Using a REF CURSOR variable in a server-to-server RPC results in an
error. However, a REF CURSOR variable is permitted in a server-to-server RPC if
the remote database is a non-Oracle database accessed through a Procedural
Gateway.
* LOB parameters are not permitted in a server-to-server RPC.
.....
Passing a cursor from one DB to the other March 23, 2006
Thank for the explanation, we solve the problem opening and closing the cursor
in one DB and passig the data to the other server in an TABLE Object by means of
a function.
java.util.zip.ZipException: invalid entry CRC (expected 0x0 but got 0xab633fa2)