java程序里的內(nèi)存泄漏是如何表現(xiàn)的

java程序里的內(nèi)存泄漏是如何表現(xiàn)的

ID:34553009

大小:26.72 KB

頁數(shù):5頁

時間:2019-03-07

java程序里的內(nèi)存泄漏是如何表現(xiàn)的_第1頁
java程序里的內(nèi)存泄漏是如何表現(xiàn)的_第2頁
java程序里的內(nèi)存泄漏是如何表現(xiàn)的_第3頁
java程序里的內(nèi)存泄漏是如何表現(xiàn)的_第4頁
java程序里的內(nèi)存泄漏是如何表現(xiàn)的_第5頁
資源描述:

《java程序里的內(nèi)存泄漏是如何表現(xiàn)的》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。

1、www.027hpedu.comJava程序里的內(nèi)存泄漏是如何表現(xiàn)的  大多數(shù)程序員都知道使用類似于Java的編程語言的好處之一就是他們無需再為內(nèi)存的分配和釋放所擔(dān)心了。你只需要簡單地創(chuàng)建對象,當(dāng)它們不再為程序所需要時Java會自行通過一個被稱為垃圾收集的機制將其移除。這個過程意味著Java已經(jīng)解決了困擾其他編程語言的一個棘手的問題--可怕的內(nèi)存泄漏。果真是這樣的嗎?  在進行深入討論之前,讓我們先回顧一下垃圾收集是如何進行實際工作的。垃圾收集器的工作就是找到程序不再需要的對象并在當(dāng)它們不再被訪問或引用時將它們移除掉。垃圾收集器從貫穿整個程序生命周期的類這個根節(jié)點開

2、始,掃描所有引用到的節(jié)點。在遍歷節(jié)點時,它跟蹤那些被活躍引用著的對象。那些不再被引用的對象就滿足了垃圾回收的條件。當(dāng)這些對象被移除時被它們占用的內(nèi)存資源會交還給Java虛擬機(JVM)?! ∫虼薐ava代碼的確不需要程序員負責(zé)內(nèi)存管理的清理工作,它自行對不再使用的對象進行垃圾收集。然而,需要記住的是,垃圾收集的關(guān)鍵在于一個對象在不再被引用時才被統(tǒng)計為不再使用。下圖對這一概念進行了說明?! ∩蠄D表示在一個Java程序執(zhí)行時具有不同的生命周期的兩個類。類A首先被實例化,它存在的時間比較長,幾乎貫穿整個進程的生命周期。在某個時間點,類B被創(chuàng)建,類A添加了一個對這個新建類的

3、引用。我們假設(shè)類B是某個用于顯示并返回用戶指令的用戶界面部件。盡管類B不再被使用,如果類A對類B的引用未被清除,類B將繼續(xù)存在并占據(jù)內(nèi)存空間,即使下一次垃圾收集被執(zhí)行?! ∈裁磿r候需要注意內(nèi)存泄漏?  如果在你的程序執(zhí)行一段時間之后遇到j(luò)ava.lang.OutOfMemoryError的話,內(nèi)存泄漏無疑是最值得懷疑的。除了這種明顯的情況之外,什么時候需要考慮內(nèi)存泄漏?完美主義的程序員會回答說所有的內(nèi)存泄漏都需要進行審查和更改。然而,在跳到這一結(jié)論之前還需要考慮其他幾點因素,包括程序的生命周期以及內(nèi)存泄漏的大小。www.whhpit.comwww.027hpedu.

4、com  考慮一下在一個程序的生命周期里垃圾收集器可能從未執(zhí)行的情況。無法保證什么時候JVM會調(diào)用垃圾收集--即使程序顯式調(diào)用System.gc()。通常情況下,垃圾收集器不會自動運行,直到程序需要比目前可用內(nèi)存還要多的內(nèi)存。此時,JVM會首先嘗試調(diào)用垃圾收集器以獲取更多可用內(nèi)存。如果這個嘗試仍舊不能夠釋放出足夠的資源,JVM將會從操作系統(tǒng)獲取更多內(nèi)存,直到達到所允許內(nèi)存的最大值?! ∨e個例子來說,一個小型的Java應(yīng)用程序,用來顯示一些簡單的配置修改的用戶界面元素,出現(xiàn)了內(nèi)存泄漏。垃圾收集器可能在程序關(guān)閉之前都不會被調(diào)用到,因為JVM可能總是有足夠的內(nèi)存來創(chuàng)建程序

5、所需要的所有對象。因此,在這種情況下,即便是一些已死對象在程序運行的時候仍舊占據(jù)著內(nèi)存,但這并不影響實際應(yīng)用?! ∪绻_發(fā)中的Java代碼將以每天24小時運行在服務(wù)器上,這時內(nèi)存泄漏將會比上面的那個配置工具程序要明顯的多了。即便是代碼中最小的內(nèi)存泄漏,在持續(xù)運行的情況下最終也將耗盡所有可用內(nèi)存?! ∠喾吹那闆r下,即使一個程序只是短暫存活,卻分配了大量臨時對象(或者少量的占用大量內(nèi)存的對象),在這些對象不再需要時沒有取消引用,這樣的Java代碼也會達到內(nèi)存限制?! ∽詈笠粋€值得注意的問題是,不必過于擔(dān)心(Java程序所造成的)內(nèi)存泄漏。Java內(nèi)存泄漏不應(yīng)該被認為是像

6、其他語言中所發(fā)生的那樣危險,比如C++的內(nèi)存丟失將永遠不會返回給操作系統(tǒng)。Java應(yīng)用程序中,我們把不再需要的卻占據(jù)著內(nèi)存資源的對象都交給JVM.所以在理論上來說,一旦Java程序和它的JVM關(guān)閉掉,所有分配的內(nèi)存都將歸還給操作系統(tǒng)?! ∪绾螖喽ǔ绦蚓哂袃?nèi)存泄漏  查看一個運行在WindowsNT平臺上的Java程序是否具有內(nèi)存泄漏,你可以簡單地在程序運行的時候去觀察任務(wù)管理器中的內(nèi)存設(shè)置。然而,在觀察一些運行中的Java程序之后,你會發(fā)現(xiàn),它們跟本地應(yīng)用程序相比使用更多內(nèi)存。我開發(fā)過的一些Java項目會啟用10到20MB的系統(tǒng)內(nèi)存。與這個數(shù)字相比,本地的操作系統(tǒng)自

7、帶的WindowsExplorer程序使用到5MB.  另外一個關(guān)于Java程序的內(nèi)存使用要注意的是典型的運行在IBMJDK1.1.8JVM上的程序似乎在其運行時不斷吞噬了越來越多的系統(tǒng)內(nèi)存。程序似乎永遠不會返回一些內(nèi)存給操作系統(tǒng),直到一個非常大的物理內(nèi)存分配給它。這會不會就是內(nèi)存泄漏的跡象?  要明白是怎么回事,我們需要熟悉JVM是如何將系統(tǒng)內(nèi)存使用作自己的堆的。在運行java.exe時,你可以使用一些特定的選項來控制垃圾收集的堆的啟動容量和最大容量(分別是-ms和-mx)。Sun的JDK1.1.8默認使用1MB的啟動設(shè)置和16MB的最大設(shè)置。IBMJDK1.

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內(nèi)容,確認文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。