心的方向
新的征途......
BlogJava
首頁
新隨筆
新文章
聯(lián)系
聚合
管理
posts - 75,comments - 19,trackbacks - 0
<
2008年2月
>
日
一
二
三
四
五
六
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
1
2
3
4
5
6
7
8
常用鏈接
我的隨筆
我的評(píng)論
我的參與
最新評(píng)論
留言簿
(1)
給我留言
查看公開留言
查看私人留言
我參與的團(tuán)隊(duì)
鄭州Java小組(0/0)
隨筆分類
DateBase(10)
hibernate(1)
J2EE(31)
JS(8)
Linux
Python (1)
Spring(1)
Web Service(2)
工具資料(8)
情感生活(5)
報(bào)表(1)
方向(3)
框架整合(5)
隨筆檔案
2010年6月 (1)
2009年7月 (1)
2008年11月 (1)
2008年9月 (1)
2008年8月 (2)
2008年6月 (1)
2008年5月 (1)
2008年4月 (14)
2008年3月 (1)
2008年2月 (5)
2008年1月 (5)
2007年12月 (5)
2007年11月 (1)
2007年10月 (2)
2007年7月 (3)
2007年6月 (5)
2007年4月 (5)
2007年3月 (21)
文章分類
Linux(4)
文章檔案
2007年3月 (4)
收藏夾
Drools 規(guī)則引擎(1)
FrameWork(2)
j2ee(5)
其他(2)
數(shù)據(jù)庫(1)
3G
王曉的BLOG-米亞羅
專注于移動(dòng)應(yīng)用開發(fā),J2ME,Symbian,Linux;
IC卡
卡人
J2EE系統(tǒng)架構(gòu)
詩特林-sterning
魅力J2EE系統(tǒng)架構(gòu)+系統(tǒng)分析
linux
Chinaitlab-Linux頻道
ChinaUnix
Developer
Linux時(shí)代
linux聯(lián)盟
中國(guó)LINUX論壇
紅聯(lián)Linux論壇
西郵linux
python
python-任我行
RCP
RCP專欄
Struts2
eXtremeComponents參考文檔
Struts 2.0系列
校驗(yàn)Validation
XFire
Xfire
XFire and Websphere 5.1
我參與的團(tuán)隊(duì)
鄭州JAVA小組
收藏Blog
C++技術(shù)相關(guān)博客
CanBeatle的博客
delphi相關(guān)博客
esffor
HuDon的專欄
jcc3120的專欄
lenhan12345的專欄
robbin
Robin's java world
superleo
中國(guó)龍
張愛雪的博客
我的世界我的夢(mèng)-上善若水的程序人生
江南白衣
簡(jiǎn)單就是美
胡冰的收藏
鄭州C++石正BLOG
思想,態(tài)度......
阿錚的籮筐
陳朋奕和謝仍明的博客
黎波
數(shù)據(jù)庫
mysql5.0 dev手冊(cè)
資料
BEA dev2dev在線
chinese document
很多JAVA文檔治療可供下載
CSS8 樣吧
提供專業(yè)的CSS樣式,各類樣式屬性查詢的好去處
IBM developerWorks 中國(guó)
JBoss Rules 學(xué)習(xí)系列
時(shí)刻關(guān)注企業(yè)軟件開發(fā)領(lǐng)域的變化與創(chuàng)新
有些JS的資料
網(wǎng)頁標(biāo)記大全
搜索
最新評(píng)論
1.?re: 如何跳出頁面的Frame框架
點(diǎn)一萬個(gè)贊!!
--#include<red.h>
2.?re: 頁面中hidden屬性的用法
不不不
--各顧各
3.?re: 關(guān)于birt中文參數(shù)
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--gmin
4.?re: 如何備份Symantec AntiVirus的病毒庫
找了很久的答案,今天終于搜索到了,真的非常謝謝博主!!
--steel
5.?re: 如何跳出頁面的Frame框架
非常非常非常非常非常非常非常謝謝謝謝謝謝謝謝謝謝謝謝謝謝謝謝謝謝謝謝謝謝你 親愛的樓主!!!!
--suansky
閱讀排行榜
1.?PowerDesigner導(dǎo)入導(dǎo)出PDM和rtf文件(12799)
2.?如何跳出頁面的Frame框架(5678)
3.?Spring與weblogic jndi集成(3492)
4.?WebSphere5.1下發(fā)布XFire的問題解決(3467)
5.?在頁面中動(dòng)態(tài)添加一行以及刪除一行列表(2936)
評(píng)論排行榜
1.?如何跳出頁面的Frame框架(4)
2.?在頁面中動(dòng)態(tài)添加一行以及刪除一行列表(2)
3.?[導(dǎo)入]Struts中關(guān)于使用javascript的問題(2)
4.?編寫properties文件的Eclipse插件(2)
5.?關(guān)于birt中文參數(shù)(1)
Java系統(tǒng)中內(nèi)存泄漏測(cè)試方法的研究
Java系統(tǒng)中內(nèi)存泄漏測(cè)試方法的研究
本文鏈接:
http://user.qzone.qq.com/18485108/blog/1203413108
Java系統(tǒng)中內(nèi)存泄漏測(cè)試方法的研究
摘 要
穩(wěn)定性是衡量軟件系統(tǒng)質(zhì)量的重要指標(biāo),
內(nèi)存
泄漏是破壞系統(tǒng)穩(wěn)定性的重要因素。由于采用垃圾回收機(jī)制,Java語言的內(nèi)存泄漏的模式與C++等語言相比有很大的不同。全文通過與C++中的內(nèi)存泄漏問題進(jìn)行對(duì)比,講述了Java內(nèi)存泄漏的基本原理,以及如何借助Optimizeit profiler工具來測(cè)試內(nèi)存泄漏和分析內(nèi)存泄漏的原因,在實(shí)踐中證明這是一套行之有效的方法。
關(guān)鍵詞
Java; 內(nèi)存泄漏; GC(垃圾收集器) 引用; Optimizeit
問題的提出
筆者曾經(jīng)參與開發(fā)的網(wǎng)管系統(tǒng),系統(tǒng)規(guī)模龐大,涉及上百萬行代碼。系統(tǒng)主要采用Java語言開發(fā),大體上分為客戶端、服務(wù)器和數(shù)據(jù)庫三個(gè)層次。在版本進(jìn)入測(cè)試和試用的過程中,現(xiàn)場(chǎng)人員和測(cè)試部人員紛紛反映:系統(tǒng)的穩(wěn)定性比較差,經(jīng)常會(huì)出現(xiàn)服務(wù)器端運(yùn)行一晝夜就死機(jī)的現(xiàn)象,客戶端跑死的現(xiàn)象也比較頻繁地發(fā)生。對(duì)于網(wǎng)管系統(tǒng)來講,經(jīng)常性的服務(wù)器死機(jī)是個(gè)比較嚴(yán)重的問題,因?yàn)轭l繁的死機(jī)不僅可能導(dǎo)致前后臺(tái)數(shù)據(jù)不一致,發(fā)生錯(cuò)誤,更會(huì)引起用戶的不滿,降低客戶的信任度。因此,服務(wù)器端的穩(wěn)定性問題必須盡快解決。
解決思路
通過察看服務(wù)器端日志,發(fā)現(xiàn)死機(jī)前服務(wù)器端頻繁拋出OutOfMemoryException內(nèi)存溢出錯(cuò)誤,因此初步把死機(jī)的原因定位為內(nèi)存泄漏引起內(nèi)存不足,進(jìn)而引起內(nèi)存溢出錯(cuò)誤。如何查找引起內(nèi)存泄漏的原因呢?有兩種思路:第一種,安排有經(jīng)驗(yàn)的編程人員對(duì)代碼進(jìn)行走查和分析,找出內(nèi)存泄漏發(fā)生的位置;第二種,使用專門的內(nèi)存泄漏測(cè)試工具Optimizeit進(jìn)行測(cè)試。這兩種方法都是解決系統(tǒng)穩(wěn)定性問題的有效手段,使用內(nèi)存測(cè)試工具對(duì)于已經(jīng)暴露出來的內(nèi)存泄漏問題的定位和解決非常有效;但是軟件測(cè)試的理論也告訴我們,系統(tǒng)中永遠(yuǎn)存在一些沒有暴露出來的問題,而且,系統(tǒng)的穩(wěn)定性問題也不僅僅只是內(nèi)存泄漏的問題,代碼走查是提高系統(tǒng)的整體代碼質(zhì)量乃至解決潛在問題的有效手段。基于這樣的考慮,我們的內(nèi)存穩(wěn)定性工作決定采用代碼走查結(jié)合測(cè)試工具的使用,雙管齊下,爭(zhēng)取比較徹底地解決系統(tǒng)的穩(wěn)定性問題。
在代碼走查的工作中,安排了對(duì)系統(tǒng)業(yè)務(wù)和開發(fā)語言工具比較熟悉的開發(fā)人員對(duì)應(yīng)用的代碼進(jìn)行了交叉走查,找出代碼中存在的數(shù)據(jù)庫連接聲明和結(jié)果集未關(guān)閉、代碼冗余和低效等故障若干,取得了良好的效果,文中主要講述結(jié)合工具的使用對(duì)已經(jīng)出現(xiàn)的內(nèi)存泄漏問題的定位方法。
內(nèi)存泄漏的基本原理
在C++語言
程序
中,使用new操作符創(chuàng)建的對(duì)象,在使用完畢后應(yīng)該通過delete操作符顯示地釋放,否則,這些對(duì)象將占用堆空間,永遠(yuǎn)沒有辦法得到回收,從而引起內(nèi)存空間的泄漏。如下的簡(jiǎn)單代碼就可以引起內(nèi)存的泄漏:
void function(){
Int[] vec = new int[5];
}
在function()方法執(zhí)行完畢后,vec數(shù)組已經(jīng)是不可達(dá)對(duì)象,在C++語言中,這樣的對(duì)象永遠(yuǎn)也得不到釋放,稱這種現(xiàn)象為內(nèi)存泄漏。
而Java是通過垃圾收集器(Garbage Collection,GC)自動(dòng)管理內(nèi)存的回收,程序員不需要通過調(diào)用函數(shù)來釋放內(nèi)存,但它只能回收無用并且不再被其它對(duì)象引用的那些對(duì)象所占用的空間。在下面的代碼中,循環(huán)申請(qǐng)Object對(duì)象,并將所申請(qǐng)的對(duì)象放入一個(gè)Vector中,如果僅僅釋放對(duì)象本身,但是因?yàn)閂ector仍然引用該對(duì)象,所以這個(gè)對(duì)象對(duì)GC來說是不可回收的。因此,如果對(duì)象加入到Vector后,還必須從Vector中刪除,最簡(jiǎn)單的方法就是將Vector對(duì)象設(shè)置為null。
Vector v = new Vector(10);
for (int i = 1; i < 100; i++)
{
Object o = new Object();
v.add(o);
o = null;
}//此時(shí),所有的Object對(duì)象都沒有被釋放,因?yàn)樽兞縱引用這些對(duì)象。
實(shí)際上無用,而還被引用的對(duì)象,GC就無能為力了(事實(shí)上GC認(rèn)為它還有用),這一點(diǎn)是導(dǎo)致內(nèi)存泄漏最重要的原因。
Java的內(nèi)存回收機(jī)制可以形象地理解為在堆空間中引入了重力場(chǎng),已經(jīng)加載的類的靜態(tài)變量和處于活動(dòng)線程的堆棧空間的變量是這個(gè)空間的牽引對(duì)象。這里牽引對(duì)象是指按照J(rèn)ava語言規(guī)范,即便沒有其它對(duì)象保持對(duì)它的引用也不能夠被回收的對(duì)象,即Java內(nèi)存空間中的本原對(duì)象。當(dāng)然類可能被去加載,活動(dòng)線程的堆棧也是不斷變化的,牽引對(duì)象的集合也是不斷變化的。對(duì)于堆空間中的任何一個(gè)對(duì)象,如果存在一條或者多條從某個(gè)或者某幾個(gè)牽引對(duì)象到該對(duì)象的引用鏈,則就是可達(dá)對(duì)象,可以形象地理解為從牽引對(duì)象伸出的引用鏈將其拉住,避免掉到回收池中;而其它的不可達(dá)對(duì)象由于不存在牽引對(duì)象的拉力,在重力的作用下將掉入回收池。在圖1中,A、B、C、D、E、F六個(gè)對(duì)象都被牽引對(duì)象所直接或者間接地“牽引”,使得它們避免在重力的作用下掉入回收池。如果TR1-A鏈和TR2-D鏈斷開,則A、B、C三個(gè)對(duì)象由于失去牽引,在重力的作用下掉入回收池(被回收),D對(duì)象也是同樣的原因掉入回收池,而F對(duì)象仍然存在一個(gè)牽引鏈(TR3-E-F),所以不會(huì)被回收,如圖2、3所示。
圖1 初始狀態(tài)
圖2 TR1-A鏈和TR2-D鏈斷開,A、B、C、D掉入回收池
圖3 A、B、C、D四個(gè)對(duì)象被回收
通過前面的介紹可以看到,由于采用了垃圾回收機(jī)制,任何不可達(dá)對(duì)象都可以由垃圾收集線程回收。因此通常說的Java內(nèi)存泄漏其實(shí)是指無意識(shí)的、非故意的對(duì)象引用,或者無意識(shí)的對(duì)象保持。無意識(shí)的對(duì)象引用是指代碼的開發(fā)人員本來已經(jīng)對(duì)對(duì)象使用完畢,卻因?yàn)榫幋a的錯(cuò)誤而意外地保存了對(duì)該對(duì)象的引用(這個(gè)引用的存在并不是編碼人員的主觀意愿),從而使得該對(duì)象一直無法被垃圾回收器回收掉,這種本來以為可以釋放掉的卻最終未能被釋放的空間可以認(rèn)為是被“泄漏了”。
這里通過一個(gè)例子來演示Java的內(nèi)存泄漏。假設(shè)有一個(gè)日志類Logger,其提供一個(gè)靜態(tài)的log(String msg)方法,任何其它類都可以調(diào)用Logger.Log(message)來將message的內(nèi)容記錄到系統(tǒng)的日志文件中。Logger類有一個(gè)類型為HashMap的靜態(tài)變量temp,每次在執(zhí)行l(wèi)og(message)方法的時(shí)候,都首先將message的值丟入temp中(以當(dāng)前線程+當(dāng)前時(shí)間為鍵),在方法退出之前再從temp中將以當(dāng)前線程和當(dāng)前時(shí)間為鍵的條目刪除。注意,這里當(dāng)前時(shí)間是不斷變化的,所以log方法在退出之前執(zhí)行刪除條目的操作并不能刪除方法執(zhí)行之初丟入的條目。這樣,任何一個(gè)作為參數(shù)傳給log方法的字符串最終由于被Logger的靜態(tài)變量temp引用,而無法得到回收,這種違背實(shí)現(xiàn)者主觀意圖的無意識(shí)的對(duì)象保持就是我們所說的Java內(nèi)存泄漏。
鑒別泄漏對(duì)象的方法
一般說來,一個(gè)正常的系統(tǒng)在其運(yùn)行穩(wěn)定后其內(nèi)存的占用量是基本穩(wěn)定的,不應(yīng)該是無限制的增長(zhǎng)的,同樣,對(duì)任何一個(gè)類的對(duì)象的使用個(gè)數(shù)也有一個(gè)相對(duì)穩(wěn)定的上限,不應(yīng)該是持續(xù)增長(zhǎng)的。根據(jù)這樣的基本假設(shè),我們可以持續(xù)地觀察系統(tǒng)運(yùn)行時(shí)使用的內(nèi)存的大小和各實(shí)例的個(gè)數(shù),如果內(nèi)存的大小持續(xù)地增長(zhǎng),則說明系統(tǒng)存在內(nèi)存泄漏,如果某個(gè)類的實(shí)例的個(gè)數(shù)持續(xù)地增長(zhǎng),則說明這個(gè)類的實(shí)例可能存在泄漏情況。
Optimizeit是Borland公司的產(chǎn)品,主要用于協(xié)助對(duì)軟件系統(tǒng)進(jìn)行代碼優(yōu)化和故障診斷,其功能眾多,使用方便,其中的OptimizeIt Profiler主要用于內(nèi)存泄漏的分析。Profiler的堆視圖(如圖4)就是用來觀察系統(tǒng)運(yùn)行使用的內(nèi)存大小和各個(gè)類的實(shí)例分配的個(gè)數(shù)的,其界面如圖四所示,各列自左至右分別為類名稱、當(dāng)前實(shí)例個(gè)數(shù)、自上個(gè)標(biāo)記點(diǎn)開始增長(zhǎng)的實(shí)例個(gè)數(shù)、占用的內(nèi)存空間的大小、自上次標(biāo)記點(diǎn)開始增長(zhǎng)的內(nèi)存的大小、被釋放的實(shí)例的個(gè)數(shù)信息、自上次標(biāo)記點(diǎn)開始增長(zhǎng)的內(nèi)存的大小被釋放的實(shí)例的個(gè)數(shù)信息,表的最后一行是匯總數(shù)據(jù),分別表示目前JVM中的對(duì)象實(shí)例總數(shù)、實(shí)例增長(zhǎng)總數(shù)、內(nèi)存使用總數(shù)、內(nèi)存使用增長(zhǎng)總數(shù)等。
在實(shí)踐中,可以分別在系統(tǒng)運(yùn)行四個(gè)小時(shí)、八個(gè)小時(shí)、十二個(gè)小時(shí)和二十四個(gè)小時(shí)時(shí)間點(diǎn)記錄當(dāng)時(shí)的內(nèi)存狀態(tài)(即抓取當(dāng)時(shí)的內(nèi)存快照,是工具提供的功能,這個(gè)快照也是供下一步分析使用),找出實(shí)例個(gè)數(shù)增長(zhǎng)的前十位的類,記錄下這十個(gè)類的名稱和當(dāng)前實(shí)例的個(gè)數(shù)。在記錄完數(shù)據(jù)后,點(diǎn)擊Profiler中右上角的Mark按鈕,將該點(diǎn)的狀態(tài)作為下一次記錄數(shù)據(jù)時(shí)的比較點(diǎn)。
圖4 Profiler 堆視圖
系統(tǒng)運(yùn)行二十四小時(shí)以后可以得到四個(gè)內(nèi)存快照。對(duì)這四個(gè)內(nèi)存快照進(jìn)行綜合分析,如果每一次快照的內(nèi)存使用都比上一次有增長(zhǎng),可以認(rèn)定系統(tǒng)存在內(nèi)存泄漏,找出在四個(gè)快照中實(shí)例個(gè)數(shù)都保持增長(zhǎng)的類,這些類可以初步被認(rèn)定為存在泄漏。
分析與定位
通過上面的數(shù)據(jù)收集和初步分析,可以得出初步結(jié)論:系統(tǒng)是否存在內(nèi)存泄漏和哪些對(duì)象存在泄漏(被泄漏),如果結(jié)論是存在泄漏,就可以進(jìn)入分析和定位階段了。
前面已經(jīng)談到Java中的內(nèi)存泄漏就是無意識(shí)的對(duì)象保持,簡(jiǎn)單地講就是因?yàn)榫幋a的錯(cuò)誤導(dǎo)致了一條本來不應(yīng)該存在的引用鏈的存在(從而導(dǎo)致了被引用的對(duì)象無法釋放),因此內(nèi)存泄漏分析的任務(wù)就是找出這條多余的引用鏈,并找到其形成的原因。前面還講到過牽引對(duì)象,包括已經(jīng)加載的類的靜態(tài)變量和處于活動(dòng)線程的堆棧空間的變量。由于活動(dòng)線程的堆棧空間是迅速變化的,處于堆棧空間內(nèi)的牽引對(duì)象集合是迅速變化的,而作為類的靜態(tài)變量的牽引對(duì)象的集合在系統(tǒng)運(yùn)行期間是相對(duì)穩(wěn)定的。
對(duì)每個(gè)被泄漏的實(shí)例對(duì)象,必然存在一條從某個(gè)牽引對(duì)象出發(fā)到達(dá)該對(duì)象的引用鏈。處于堆棧空間的牽引對(duì)象在被從棧中彈出后就失去其牽引的能力,變?yōu)榉菭恳龑?duì)象,因此,在長(zhǎng)時(shí)間的運(yùn)行后,被泄露的對(duì)象基本上都是被作為類的靜態(tài)變量的牽引對(duì)象牽引。
Profiler的內(nèi)存視圖除了堆視圖以外,還包括實(shí)例分配視圖(圖5)和實(shí)例引用圖(圖6)。
Profiler的實(shí)例引用圖為找出從牽引對(duì)象到泄漏對(duì)象的引用鏈提供了非常直接的方法,其界面的第二個(gè)欄目中顯示的就是從泄漏對(duì)象出發(fā)的逆向引用鏈。需要注意的是,當(dāng)一個(gè)類的實(shí)例存在泄漏時(shí),并非其所有的實(shí)例都是被泄漏的,往往只有一部分是被泄漏對(duì)象,其它則是正常使用的對(duì)象,要判斷哪些是正常的引用鏈,哪些是不正常的引用鏈(引起泄漏的引用鏈)。通過抽取多個(gè)實(shí)例進(jìn)行引用圖的分析統(tǒng)計(jì)以后,可以找出一條或者多條從牽引對(duì)象出發(fā)的引用鏈,下面的任務(wù)就是找出這條引用鏈形成的原因。
實(shí)例分配圖提供的功能是對(duì)每個(gè)類的實(shí)例的分配位置進(jìn)行統(tǒng)計(jì),查看實(shí)例分配的統(tǒng)計(jì)結(jié)果對(duì)于分析引用鏈的形成具有一定的作用,因?yàn)檎业椒峙滏溑c引用鏈的交點(diǎn)往往就可以找到了引用鏈形成的原因,下面將具體介紹。
圖5 實(shí)例分配圖
圖6 實(shí)例引用圖
設(shè)想一個(gè)實(shí)例對(duì)象a在方法f中被分配,最終被實(shí)例對(duì)象b所引用,下面來分析從b到a的引用鏈可能的形成原因。方法f在創(chuàng)建對(duì)象a后,對(duì)它的使用分為四種情況:1、將a作為返回值返回;2、將a作為參數(shù)調(diào)用其它方法;3、在方法內(nèi)部將a的引用傳遞給其它對(duì)象;4、其它情況。其中情況4不會(huì)造成由b到a的引用鏈的生成,不用考慮。下面考慮其它三種情況:對(duì)于1、2兩種情況,其造成的結(jié)果都是在另一個(gè)方法內(nèi)部獲得了對(duì)象a的引用,它的分析與方法f的分析完全一樣(遞歸分析);考慮第3種情況:1、假設(shè)方法f直接將對(duì)象a的引用加入到對(duì)象b,則對(duì)象b到a的引用鏈就找到了,分析結(jié)束;2、假設(shè)方法f將對(duì)象a的引用加入到對(duì)象c,則接下來就需要跟蹤對(duì)象c的使用,對(duì)象c的分析比對(duì)象a的分析步驟更多一些,但大體原理都是一樣的,就是跟蹤對(duì)象從創(chuàng)建后被使用的歷程,最終找到其被牽引對(duì)象引用的原因。
現(xiàn)在將泄漏對(duì)象的引用鏈以及引用鏈形成的原因找到了,內(nèi)存泄漏測(cè)試與分析的工作就到此結(jié)束,接下來的工作就是修改相應(yīng)的
設(shè)計(jì)
或者實(shí)現(xiàn)中的錯(cuò)誤了。
總結(jié)
使用上述的測(cè)試和分析方法,在實(shí)踐中先后進(jìn)行了三次測(cè)試,找出了好幾處內(nèi)存泄漏錯(cuò)誤。系統(tǒng)的穩(wěn)定性得到很大程度的提高,最初運(yùn)行1~2天就拋出內(nèi)存溢出異常,修改完成后,系統(tǒng)從未出現(xiàn)過內(nèi)存溢出異常。此方法適用于任何使用Java語言開發(fā)的、對(duì)穩(wěn)定性有比較高要求的軟件系統(tǒng)。
posted on 2008-02-24 18:23
阿偉
閱讀(304)
評(píng)論(0)
編輯
收藏
所屬分類:
J2EE
新用戶注冊(cè)
刷新評(píng)論列表
只有注冊(cè)用戶
登錄
后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關(guān)文章:
強(qiáng)制類型轉(zhuǎn)換-ArrayList使用toArray()構(gòu)造數(shù)組時(shí)的問題
Java異常(轉(zhuǎn)載)
追MM與Java的23種設(shè)計(jì)模式
優(yōu)化WebSphere應(yīng)用性能技巧集錦
web.xml配置的詳細(xì)說明3
web.xml配置的詳細(xì)說明 2
web.xml配置的詳細(xì)說明1
web.xml的細(xì)節(jié)
Spring與weblogic jndi集成
spring中session管理opersession,避免頁面中數(shù)據(jù)未輸出完session就被關(guān)閉了(session延遲加載)
Copyright ©2025 阿偉 Powered By
博客園
模板提供:
滬江博客
主站蜘蛛池模板:
小草在线看片免费人成视久网
|
国产精品1024在线永久免费
|
亚洲综合色视频在线观看
|
亚洲欧美日韩中文高清www777
|
97性无码区免费
|
亚洲人和日本人jizz
|
亚欧免费视频一区二区三区
|
99久久久国产精品免费无卡顿
|
亚洲高清资源在线观看
|
久久综合给合久久国产免费
|
亚洲综合日韩中文字幕v在线
|
精品无码国产污污污免费网站
|
亚洲高清免费在线观看
|
67194熟妇在线永久免费观看
|
亚洲男人的天堂久久精品
|
成人午夜18免费看
|
老司机精品视频免费
|
亚洲国产精品综合久久网络
|
丰满少妇作爱视频免费观看
|
国产精品亚洲精品日韩已满
|
99xxoo视频在线永久免费观看
|
亚洲乱码一二三四区麻豆
|
免费无码一区二区三区蜜桃大
|
高h视频在线免费观看
|
亚洲欧洲日产国码无码网站
|
久久青草免费91观看
|
国内精品久久久久影院亚洲
|
日韩免费无砖专区2020狼
|
一级成人毛片免费观看
|
久久精品国产精品亚洲蜜月
|
噼里啪啦免费观看高清动漫4
|
亚洲精华国产精华精华液网站
|
亚洲国产精品日韩专区AV
|
久久青草精品38国产免费
|
亚洲综合色婷婷在线观看
|
亚洲国产精品自产在线播放
|
97在线视频免费播放
|
亚洲成在人线在线播放无码
|
国产亚洲精品无码成人
|
久久WWW免费人成人片
|
久久久久久国产a免费观看不卡
|