內(nèi)存泄漏指由于疏忽或錯(cuò)誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存的情況。內(nèi)存泄漏并非指內(nèi)存在物理上的消失,而是應(yīng)用程序分配某段內(nèi)存后,由于設(shè)計(jì)錯(cuò)誤,失去了對(duì)該段內(nèi)存的控制,因而造成了內(nèi)存的浪費(fèi)。
成都創(chuàng)新互聯(lián)公司專(zhuān)業(yè)為企業(yè)提供通城網(wǎng)站建設(shè)、通城做網(wǎng)站、通城網(wǎng)站設(shè)計(jì)、通城網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、通城企業(yè)網(wǎng)站模板建站服務(wù),十多年通城做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
可以使用相應(yīng)的軟件測(cè)試工具對(duì)軟件進(jìn)行檢測(cè)。
1. ccmalloc-Linux和Solaris下對(duì)C和C++程序的簡(jiǎn)單的使用內(nèi)存泄漏和malloc調(diào)試庫(kù)。
2. Dmalloc-Debug Malloc Library.
3. Electric
Fence-Linux分發(fā)版中由Bruce Perens編寫(xiě)的malloc()調(diào)試庫(kù)。
4. Leaky-Linux下檢測(cè)內(nèi)存泄漏的程序。
5. LeakTracer-Linux、Solaris和HP-UX下跟蹤和分析C++程序中的內(nèi)存泄漏。
6. MEMWATCH-由Johan
Lindh編寫(xiě),是一個(gè)開(kāi)放源代碼C語(yǔ)言?xún)?nèi)存錯(cuò)誤檢測(cè)工具,主要是通過(guò)gcc的precessor來(lái)進(jìn)行。
7. Valgrind-Debugging and profiling Linux programs, aiming at
programs written in C and C++.
8. KCachegrind-A visualization tool for the profiling data
generated by Cachegrind and Calltree.
9. Leak
Monitor-一個(gè)Firefox擴(kuò)展,能找出跟Firefox相關(guān)的泄漏類(lèi)型。
10. IE Leak Detector
(Drip/IE Sieve)-Drip和IE Sieve leak
detectors幫助網(wǎng)頁(yè)開(kāi)發(fā)員提升動(dòng)態(tài)網(wǎng)頁(yè)性能通過(guò)報(bào)告可避免的因?yàn)镮E局限的內(nèi)存泄漏。
11. Windows Leaks
Detector-探測(cè)任何Win32應(yīng)用程序中的任何資源泄漏(內(nèi)存,句柄等),基于Win API調(diào)用鉤子。
12. SAP Memory
Analyzer-是一款開(kāi)源的JAVA內(nèi)存分析軟件,可用于輔助查找JAVA程序的內(nèi)存泄漏,能容易找到大塊內(nèi)存并驗(yàn)證誰(shuí)在一直占用它,它是基于Eclipse
RCP(Rich Client Platform),可以下載RCP的獨(dú)立版本或者Eclipse的插件。
13. DTrace-即動(dòng)態(tài)跟蹤Dynamic
Tracing,是一款開(kāi)源軟件,能在Unix類(lèi)似平臺(tái)運(yùn)行,用戶(hù)能夠動(dòng)態(tài)檢測(cè)操作系統(tǒng)內(nèi)核和用戶(hù)進(jìn)程,以更精確地掌握系統(tǒng)的資源使用狀況,提高系統(tǒng)性能,減少支持成本,并進(jìn)行有效的調(diào)節(jié)。
14. IBM Rational PurifyPlus-幫助開(kāi)發(fā)人員查明C/C++、托管.NET、Java和VB6代碼中的性能和可靠性錯(cuò)誤。PurifyPlus
將內(nèi)存錯(cuò)誤和泄漏檢測(cè)、應(yīng)用程序性能描述、代碼覆蓋分析等功能組合在一個(gè)單一、完整的工具包中。
15. Parasoft Insure++-針對(duì)C/C++應(yīng)用的運(yùn)行時(shí)錯(cuò)誤自動(dòng)檢測(cè)工具,它能夠自動(dòng)監(jiān)測(cè)C/C++程序,發(fā)現(xiàn)其中存在著的內(nèi)存破壞、內(nèi)存泄漏、指針錯(cuò)誤和I/O等錯(cuò)誤。并通過(guò)使用一系列獨(dú)特的技術(shù)(SCI技術(shù)和變異測(cè)試等),徹底的檢查和測(cè)試我們的代碼,精確定位錯(cuò)誤的準(zhǔn)確位置并給出詳細(xì)的診斷信息。能作為Microsoft
Visual C++的一個(gè)插件運(yùn)行。
16. Compuware DevPartner for Visual C++ BoundsChecker
Suite-為C++開(kāi)發(fā)者設(shè)計(jì)的運(yùn)行錯(cuò)誤檢測(cè)和調(diào)試工具軟件。作為Microsoft Visual Studio和C++ 6.0的一個(gè)插件運(yùn)行。
17. Electric Software GlowCode-包括內(nèi)存泄漏檢查,code
profiler,函數(shù)調(diào)用跟蹤等功能。給C++和.Net開(kāi)發(fā)者提供完整的錯(cuò)誤診斷,和運(yùn)行時(shí)性能分析工具包。
18. Compuware DevPartner Java
Edition-包含Java內(nèi)存檢測(cè),代碼覆蓋率測(cè)試,代碼性能測(cè)試,線(xiàn)程死鎖,分布式應(yīng)用等幾大功能模塊。
19. Quest JProbe-分析Java的內(nèi)存泄漏。
20. ej-technologies JProfiler-一個(gè)全功能的Java剖析工具,專(zhuān)用于分析J2SE和J2EE應(yīng)用程序。它把CPU、執(zhí)行緒和內(nèi)存的剖析組合在一個(gè)強(qiáng)大的應(yīng)用中。JProfiler可提供許多IDE整合和應(yīng)用服務(wù)器整合用途。JProfiler直覺(jué)式的GUI讓你可以找到效能瓶頸、抓出內(nèi)存泄漏、并解決執(zhí)行緒的問(wèn)題。4.3.2注冊(cè)碼:A-G666#76114F-1olm9mv1i5uuly#0126
21. BEA JRockit-用來(lái)診斷Java內(nèi)存泄漏并指出根本原因,專(zhuān)門(mén)針對(duì)Intel平臺(tái)并得到優(yōu)化,能在Intel硬件上獲得最高的性能。
22. SciTech Software AB .NET Memory
Profiler-找到內(nèi)存泄漏并優(yōu)化內(nèi)存使用針對(duì)C#,VB.Net,或其它.Net程序。
23. YourKit .NET Java Profiler-業(yè)界領(lǐng)先的Java和.NET程序性能分析工具。
24. AutomatedQA AQTime-AutomatedQA的獲獎(jiǎng)產(chǎn)品performance profiling和memory
debugging工具集的下一代替換產(chǎn)品,支持Microsoft, Borland, Intel, Compaq 和
GNU編譯器。可以為.NET和Windows程序生成全面細(xì)致的報(bào)告,從而幫助您輕松隔離并排除代碼中含有的性能問(wèn)題和內(nèi)存/資源泄露問(wèn)題。支持.Net
1.0,1.1,2.0,3.0和Windows 32/64位應(yīng)用程序。
25. JavaScript Memory Leak Detector-微軟全球產(chǎn)品開(kāi)發(fā)歐洲團(tuán)隊(duì)(Global Product
Development- Europe team, GPDE)
發(fā)布的一款調(diào)試工具,用來(lái)探測(cè)JavaScript代碼中的內(nèi)存泄漏,運(yùn)行為IE系列的一個(gè)插件。
盡管很多人相信在.net應(yīng)用中談及內(nèi)存及資源泄露是件很輕松的事情。但GC(垃圾回收器)并不是魔法師,并不能把你完全從小心翼翼處理內(nèi)存與資源損耗中解放出來(lái)。
本文中我將解釋緣何內(nèi)存泄露依然存在以及如何避免其出現(xiàn)。別擔(dān)心,本文不涉及GC內(nèi)部工作機(jī)制及其它.net的資源及內(nèi)存管理等高級(jí)特性中。
理解泄露本身及如何避免其出現(xiàn)很重要,尤其因?yàn)樗鼰o(wú)法輕松地自動(dòng)檢測(cè)到。單元測(cè)試在此方面無(wú)能為力。一旦產(chǎn)品中你的程序崩潰了,你需要馬上找出解決方案。所以在一切都還不是太晚前,花些時(shí)間來(lái)學(xué)習(xí)一下本文吧。
Table of Content
· 介紹
· 泄露?資源?指什么?
· 如何檢測(cè)泄露并找到泄露的資源
· 常見(jiàn)內(nèi)存泄露原因
· 常見(jiàn)內(nèi)存泄露原因演示
· 如何避免泄露
· 相關(guān)工具
· 結(jié)論
· 資源
介紹
近期,我參與了一個(gè)大的.net項(xiàng)目(暫叫它項(xiàng)目X吧),我在項(xiàng)目中負(fù)責(zé)追蹤內(nèi)存與資源泄露。大部分時(shí)間我都花在與GUI關(guān)聯(lián)的泄露上,更準(zhǔn)確地說(shuō)是一個(gè)基于Composite UI Application Block (CAB).的windows窗體應(yīng)用。接下來(lái)我要說(shuō)的直接應(yīng)用到winform上的內(nèi)容,多數(shù)見(jiàn)解同樣可以適用到其它.net應(yīng)用中(像WPF,Silverlight,ASP.NET,Windows service,console application 等等)。
我不是個(gè)處理泄露方面的專(zhuān)家,所以我不得不深入鉆研了一下應(yīng)用程序,做一些清理工作。本文的目標(biāo)是與你們分享在我解決問(wèn)題過(guò)程中的所得所悟。希望能夠幫助那些需要檢測(cè)與解決內(nèi)存、資源泄露問(wèn)題的朋友。下面的概述部分首先會(huì)介紹什么是泄露,之后會(huì)看看如何檢測(cè)到泄露和被泄露資源,以及如何解決與避免類(lèi)似泄露,最后我會(huì)列出一個(gè)對(duì)此過(guò)程有幫助的工具列表及相關(guān)資源。
泄露?資源?指什么?
內(nèi)存泄露
在進(jìn)一步深入前,讓我們先來(lái)定義下我所謂的“內(nèi)存泄露”。簡(jiǎn)單引用在Wikipedia上找到的定義吧。該定義與我打算通過(guò)本文所幫助解決的問(wèn)題完美的一致:
在計(jì)算機(jī)科學(xué)領(lǐng)域中,內(nèi)存泄露是指一種特定的內(nèi)存損耗,該損耗是由一個(gè)計(jì)算機(jī)程序未成功釋放不需要的內(nèi)存引起的。通常是程序中的BUG阻礙了不需要內(nèi)存的釋放。
仍然來(lái)自Wikipedia:”以下語(yǔ)言提供了自動(dòng)的內(nèi)存管理,但并不能避免內(nèi)存泄露。像 Java,C#,VB.NET或是LISP等?!?/p>
GC只回收那些不再使用的內(nèi)存。而使用中的內(nèi)存無(wú)法釋放。在.net中,只要有一個(gè)引用指向的對(duì)象均不會(huì)被GC所釋放。
句柄與資源
內(nèi)存可不是唯一被視為資源的。當(dāng)你的.net應(yīng)用程序在Windows上運(yùn)行時(shí),消耗著一個(gè)完整的系統(tǒng)資源集。微軟定義了系統(tǒng)三類(lèi)對(duì)象:用戶(hù)(user),圖形設(shè)備接口(GUI),以及系統(tǒng)內(nèi)核(kernel)。我不會(huì)在此給出完整的分類(lèi)對(duì)象列表,只是指出一些重要的:
· 系統(tǒng)通過(guò)使用用戶(hù)對(duì)象(User objects) 來(lái)支持windows管理。相關(guān)對(duì)象包括:提速緩沖表(Accelerator tables),Carets(補(bǔ)字號(hào)?),指針(Cursors),鉤子(Hooks),圖標(biāo)(Icons),菜單(Menus)和窗體(Windows)。
· GDI對(duì)象 支持圖形繪制:位圖(bitmaps),筆刷(Brushes),設(shè)備上下文(DC),字體(Fonts),內(nèi)存設(shè)置上下文(Memory DCs),元文件(Metafiles),畫(huà)筆(Pens),區(qū)域(Regions)等。
· 內(nèi)核對(duì)象 支持內(nèi)存管理,進(jìn)程執(zhí)行和進(jìn)程間通訊(IPC):文件,進(jìn)程,線(xiàn)程,信號(hào)(Semaphores),定時(shí)器(Timer),訪(fǎng)問(wèn)記號(hào)(Access tokens),套接字(Sockets)等。
所有系統(tǒng)對(duì)象的詳細(xì)情況都可以在MSDN中找到。
系統(tǒng)對(duì)象之外,你還會(huì)碰到句柄(handles).據(jù)MSDN的陳述,應(yīng)用程序不能直接訪(fǎng)問(wèn)對(duì)象數(shù)據(jù)或是對(duì)象所代表的系統(tǒng)資源。取而代之,應(yīng)用程序一定都會(huì)獲得一個(gè)對(duì)象句柄(Handle),可以使用它檢查或是修改系統(tǒng)資源。在.net中無(wú)論如何,多數(shù)情況下系統(tǒng)資源的使用都是透明的,因?yàn)橄到y(tǒng)對(duì)象與句柄都由.net類(lèi)直接或間接代表了。
非托管資源
像系統(tǒng)對(duì)象(System objects)這樣的資源自身都不是個(gè)問(wèn)題,但本文仍涵蓋了它們,因?yàn)橄馱indows這樣的操作系統(tǒng)對(duì)可同時(shí)打開(kāi)的 套接字、文件等的數(shù)量都有限制。所以關(guān)注應(yīng)用程序所使用系統(tǒng)對(duì)象的數(shù)量非常重要。
在特定時(shí)間段內(nèi)一個(gè)進(jìn)程所能使用的User與GDI對(duì)象數(shù)目也是有配額的。缺省值是10000個(gè)GDI對(duì)象和10000個(gè)User對(duì)象。如果想知道本機(jī)的相關(guān)設(shè)置值,可以使用如下的注冊(cè)表鍵:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows: GDIProcessHandleQuota 和 USERProcessHandleQuota.
猜到了什么?確實(shí)沒(méi)有這么簡(jiǎn)單,還有一些你會(huì)很快達(dá)到的其它限制。比如參照:我的一篇有關(guān)桌面堆的博客 所述。
假設(shè)這些值是可以自定義的,你也許認(rèn)為一個(gè)解決方案就是打破默認(rèn)值的限制—調(diào)高這些配額。但我認(rèn)為這可不是個(gè)好主意,有如下原因:
1. 配額存在的原因:系統(tǒng)中不是只有你獨(dú)自一個(gè)應(yīng)用程序,所有運(yùn)行在計(jì)算機(jī)中的其它進(jìn)程與你的應(yīng)用應(yīng)該分享系統(tǒng)資源。
2. 如果你修改配額,使它不同于其它系統(tǒng)了。你不得不確認(rèn)所有你的應(yīng)用程序需要運(yùn)行的機(jī)器都完成了這樣的修改,而且這樣的修改從系統(tǒng)管理員的角度來(lái)說(shuō)是否會(huì)有問(wèn)題也需要確認(rèn)。
3. 大部分都采用了默認(rèn)配額值。如果你發(fā)現(xiàn)配置值對(duì)你應(yīng)用程序來(lái)說(shuō)不夠,那你可能確實(shí)有些清理工作要做了。
如何檢測(cè)泄露及找到泄露的資源
泄露帶來(lái)的實(shí)際問(wèn)題在MSDN上的一篇文章中有著很好的描述:
哪怕在小的泄露只要它反復(fù)出現(xiàn)也會(huì)拖垮系統(tǒng)。
這與水的泄露異曲同工。一滴水的落下不是什么大問(wèn)題。但是一滴一滴如此反復(fù)的泄露也會(huì)變?yōu)橐粋€(gè)大問(wèn)題。
像我稍后解釋的,一個(gè)無(wú)意義的對(duì)象可以在內(nèi)存中維持一整圖的重量級(jí)對(duì)象。
仍然是同一篇文章,你會(huì)了解到:
通常三步根除泄露:
1.發(fā)現(xiàn)泄露
2.找到被泄露的資源
3.決定在源碼中何時(shí)何處釋放該資源
最直接“發(fā)現(xiàn)”泄露的方式是遭受泄露引發(fā)的問(wèn)題
你或許沒(méi)有見(jiàn)過(guò)內(nèi)存不足?!皟?nèi)存不足”提示信息極少出現(xiàn)。因?yàn)椴僮飨到y(tǒng)運(yùn)行中實(shí)際內(nèi)存(RAM)不足時(shí),它會(huì)使用硬盤(pán)空間來(lái)擴(kuò)展內(nèi)存。(稱(chēng)為虛擬內(nèi)存)。
在你的圖形應(yīng)用程序中可能更多出現(xiàn)的是“句柄不足”的異常。準(zhǔn)確的異常不是System.ComponentModel.Win32Exception 就是 System.OutOfMemoryException 均包含如下信息:”創(chuàng)建窗體句柄錯(cuò)誤”。這兩個(gè)異常多發(fā)于兩個(gè)資源被同時(shí)使用的情況下,通常都因?yàn)樵撫尫诺膶?duì)象沒(méi)有被釋放所致。
另外一種你會(huì)經(jīng)常碰到的情況是你的應(yīng)用程序或是整個(gè)系統(tǒng)變更得越來(lái)越慢。這種情況的發(fā)生是因?yàn)槟愕南到y(tǒng)資源即將耗盡。
我來(lái)做個(gè)生硬的推斷:大多數(shù)應(yīng)用程序的泄露在多數(shù)時(shí)間里都不是個(gè)問(wèn)題,因?yàn)橛尚孤秾?dǎo)致出現(xiàn)的問(wèn)題只在你的應(yīng)用程序集中使用很長(zhǎng)時(shí)間的情況下才會(huì)出現(xiàn)。
如果你懷疑有些對(duì)象在應(yīng)該被釋放后仍逗留在內(nèi)存中,那需要做的第一件事就是找出這些對(duì)象都是什么。
這看起來(lái)很明顯,但是找起來(lái)卻不是這樣。
建議通過(guò)內(nèi)存工具找到非預(yù)期逗留在內(nèi)存中的高級(jí)別對(duì)象或是根容器。在項(xiàng)目x中,這些對(duì)象可能是類(lèi)似LayoutView實(shí)例一樣的對(duì)象們(我們使用了MVP(Model View Presentation )模式)。在你的實(shí)際項(xiàng)目中,它可能依賴(lài)于你的根對(duì)象是什么。
下一步就是找出它們?cè)撓s還在的原因。這才是調(diào)試器與工具能真正幫忙的。它們可以顯示出這些對(duì)象是如何鏈接在一起的。通過(guò)查看那些指向“僵尸對(duì)象”(the zombie object)的引用你就可以找到引起問(wèn)題的根本原因了。
你可以選擇 ninja方式(譯者:間諜方式?)(參照 工具介紹章節(jié)中有關(guān) SOS.dll 和 WinDbg 的部分)。
我在項(xiàng)目X中用了JetBrains的dotTrace,本文中我將繼續(xù)使用它來(lái)介紹。在后面的工具相關(guān)章節(jié)中我會(huì)向你更多的介紹該工具。
你的目標(biāo)是找到最終引起問(wèn)題的那個(gè)引用。不要停留在你找到的第一個(gè)目標(biāo)上,但是也要問(wèn)問(wèn)自己為什么這個(gè)家伙還在內(nèi)存中。
常見(jiàn)內(nèi)存泄露的原因
上面提到的泄露情況在.net中較常見(jiàn)。好消息是造成這些泄露的原因并不多。這意味著當(dāng)你嘗試解決一個(gè)泄露問(wèn)題時(shí),不需要在大量可能的原因間搜尋。
我們來(lái)回顧一下這些常見(jiàn)的罪魁禍?zhǔn)?,我把它們區(qū)別開(kāi)來(lái):
· 靜態(tài)引用
· 未注銷(xiāo)的事件綁定
· 未注銷(xiāo)的靜態(tài)事件綁定
· 未調(diào)用Dispose方法
· Dispose方法未正常完成
除了上列典型的原因外,還有些其它情況也可能引發(fā)泄露:
· Windows Forms:綁定源濫用
· CAB:未移除對(duì)工作項(xiàng)的調(diào)用
我只列出了可能在你應(yīng)用程序中出現(xiàn)的一些原因,但應(yīng)該清楚你的應(yīng)用程序依賴(lài)的其它.net代碼、庫(kù)實(shí)際使用中也可能引發(fā)泄露。
我們來(lái)舉個(gè)例子。在項(xiàng)目x中,使用了一套第三方控件來(lái)構(gòu)造界面。其中一個(gè)用來(lái)顯示所有工具欄的控件,它管理著一個(gè)工具欄列表。這種方式?jīng)]什么,但有一點(diǎn),即使被管理的工具欄自身實(shí)現(xiàn)了IDisposable接口,管理類(lèi)卻永遠(yuǎn)也不會(huì)去調(diào)用它的Dispose方法。這是一個(gè)bug.幸運(yùn)的是這發(fā)生在一個(gè)很容易發(fā)現(xiàn)的工作區(qū):只能我們自身來(lái)調(diào)用所有工具樣的Dispose方法了。不幸的是這還不夠,工具欄類(lèi)自身問(wèn)題也不少:它并沒(méi)有釋放自身承載的控件(按鈕,標(biāo)簽等等)。所以在解決方案中還要添加對(duì)每個(gè)工具欄中控件的釋放,但是這次可就沒(méi)那么簡(jiǎn)單了,因?yàn)楣ぞ邫谥械拿總€(gè)子控件都不同。不管怎么樣這只是一個(gè)特殊的例子,我要表達(dá)的觀(guān)點(diǎn)是你應(yīng)用程序中使用的任何第三方庫(kù)、組件都可能引發(fā)泄漏。
最后,還有一種由.net framework造成的泄露,由一些不好的使用習(xí)慣引起。即使.net framework自身可能引發(fā)泄露,但這是你極少會(huì)遭遇到的情況。把責(zé)任推到.net身上很容易,但在我們把問(wèn)題推到別人頭上前,還是應(yīng)該先從自身寫(xiě)的代碼出發(fā),看看里面有沒(méi)有問(wèn)題。
常見(jiàn)泄露演示
我已經(jīng)列舉出了泄露主要的來(lái)源,但我還不想僅限于此。如果每個(gè)泄露我都能舉個(gè)鮮活的例子的話(huà),我想本文會(huì)更實(shí)用些。好,我們先啟動(dòng)Vs 和 dotTrace , 然后看些示例代碼。我會(huì)同時(shí)演示如何解決或是避免每個(gè)泄露情況。
項(xiàng)目X中使用了CAB和MVP模式,這意味著界面由工作空間、視圖和呈現(xiàn)者組成。簡(jiǎn)單起見(jiàn),我決定使用包含一組窗口的Winform應(yīng)用。其中使用了與Jossef Goldberg的一篇關(guān)于“Wpf應(yīng)用程序內(nèi)存泄露”文章中相同的方法。甚至我會(huì)直接把相同的例子和事件處理函數(shù)應(yīng)用到我的Winform App中。
(1)簡(jiǎn)化開(kāi)發(fā)操作
雖然ASP,PHP等語(yǔ)言很容易使用,但是網(wǎng)頁(yè)程序過(guò)大時(shí)會(huì)顯得相當(dāng)復(fù)雜。ASP.NET在代碼編寫(xiě)方面最大的特色是將頁(yè)面邏輯和業(yè)務(wù)邏輯分開(kāi),它分離程序代碼與顯示內(nèi)容,使網(wǎng)頁(yè)更容易編寫(xiě),同時(shí)程序代碼看起來(lái)更潔凈、更簡(jiǎn)單。
(2)語(yǔ)言獨(dú)立性
在使用ASP制作網(wǎng)頁(yè)時(shí)可以使用多種語(yǔ)言來(lái)編寫(xiě)程序,但是這些只限于腳本語(yǔ)言,如VBScript, Jscript。ASP.NET則允許使用編譯式的語(yǔ)言,提供較好的執(zhí)行效率和跨語(yǔ)言的兼容性,如VB.NET,C#,等等,另外有一些合作廠(chǎng)商也提供開(kāi)發(fā).NET應(yīng)用程序的支持,如Perl、Pascal、Cobol等。
(3)提高執(zhí)行效率
由于ASP.NET的程序代碼是編譯過(guò)的,所以執(zhí)行時(shí)會(huì)比ASP的執(zhí)行方式快很多。另外,ASP.NET也提供快取的能力,有效的縮短服務(wù)器的應(yīng)答時(shí)間(如圖ASP和ASP.NET編譯方式的比較)。
4)簡(jiǎn)化部署與組件的操作
在ASP中調(diào)用組件,程序的部署過(guò)程會(huì)變得非常復(fù)雜。目前組件使用都需要復(fù)雜的注冊(cè)操作,同時(shí)組件在使用中經(jīng)常會(huì)被鎖定而無(wú)法更新版本。在ASP.NET中不需要考慮組件注冊(cè)的問(wèn)題,直接將文件復(fù)制到目的計(jì)算機(jī)相應(yīng)的目錄下就可以了。
(5)增進(jìn)適用性
ASP.NET能解決應(yīng)用程序故障。對(duì)于內(nèi)存泄露的情況,能自動(dòng)重新啟動(dòng)進(jìn)程以增進(jìn)適用性,從來(lái)不死機(jī)。任何會(huì)造成內(nèi)存泄露的程序代碼或產(chǎn)生無(wú)窮循環(huán)或沒(méi)有關(guān)閉使用的資源的程序代碼將只會(huì)影響到一條線(xiàn)程。
(6)更佳的安全機(jī)制
在ASP中唯一能使用的驗(yàn)證方式是Windows Authentication; 而ASP.NET則提供三種不同的登陸驗(yàn)證方式:Windows、Passport 和 Cookie。也可以利用Impersonation功能,使用登陸者的權(quán)限執(zhí)行一些程序代碼或存取資源。
(7)支持下一代的Web Service
簡(jiǎn)單的說(shuō),Web Service是指可以跨Internet調(diào)用的應(yīng)用程序,提供應(yīng)用程序重復(fù)使用的功能,它能使兩個(gè)不同的系統(tǒng)擁有一個(gè)溝通的管道。
(8)Session 可以跨進(jìn)程、跨機(jī)器
使用ASP.NET,Session的狀態(tài)可以在不同計(jì)算機(jī)的不同進(jìn)程中維護(hù),以解決Web Farm的Session維護(hù)問(wèn)題。
通過(guò)以上對(duì)ASP.NET的技術(shù)特點(diǎn)我們可以對(duì).NET技術(shù)有了一個(gè)簡(jiǎn)單的了解,這樣根據(jù)其優(yōu)點(diǎn)我們就很容易知道選擇.NET的優(yōu)點(diǎn)??梢酝瞥?NET的其他的技術(shù)的特點(diǎn)。
如果不要原來(lái)的數(shù)據(jù),直接Redim a(199)
,所有數(shù)據(jù)清空,如果需要保留原來(lái)的數(shù)據(jù),加上關(guān)鍵字preserve redim a(199)
,則保留原來(lái)數(shù)據(jù),如此定義,不會(huì)造成內(nèi)存泄露的