亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

輕松搞定Java內存泄漏

2019-11-18 11:53:14
字體:
來源:轉載
供稿:網友

  抽象

  盡管java虛擬機和垃圾回收機制治理著大部分的內存事務,但是在java軟件中還是可能存在內存泄漏的情況。的確,在大型工程中,內存泄漏是一個普遍問題。避免內存泄漏的第一步,就是要了解他們發生的原因。這篇文章就是要介紹一些常見的缺陷,然后提供一些非常好的實踐例子來指導你寫出沒有內存泄漏的代碼。一旦你的程序存在內存泄漏,要查明代碼中引起泄漏的原因是很困難的。同時這篇文章也要介紹一個新的工具來查找內存泄漏,然后指明發生的根本原因。這個工具輕易上手,可以讓你找到產品級系統中的內存泄漏。

  垃圾回收(GC)的角色

  雖然垃圾回收關心著大部分的問題,包括內存治理,使得程序員的任務顯得更加輕松,但是程序員還是可能犯些錯誤導致內存泄漏問題。GC(垃圾回收)通過遞歸對所有從"根"對象(堆棧中的對象,靜態數據成員,JNI句柄等等)繼續下來的引用進行工作,然后標記所有可以訪問的活著的對象。而這些對象變成了程序唯一能夠操縱的對象,其他的對象都被釋放了。因為GC使得程序不能夠訪問那些被釋放的對象,所以這樣做是安全的。

  內存治理可以說是自動的,但是這并沒有讓程序員脫離內存治理問題。比方說,對于內存的分配(還有釋放)總是存在一定的開銷,盡管這些開銷對程序員來說是暗含的。一個程序假如創建了很多對象,那么它就要比完成相同任務而創建了較少對象的程序執行的速度慢(其他提供的內容都相同)。

  導致內存泄漏主要的原因是,先前申請了內存空間而忘記了釋放。假如程序中存在對無用對象的引用,那么這些對象就會駐留內存,消耗內存,因為無法讓垃圾回收器驗證這些對象是否不再需要。正如我們前面看到的,假如存在對象的引用,這個對象就被定義為"活著的",同時不會被釋放。要確定對象所占內存將被回收,程序員就要務必確認該對象不再會被使用。典型的做法就是把對象數據成員設為null或者從集合中移除該對象。注重,當局部變量不需要時,不需明顯的設為null,因為一個方法執行完畢時,這些引用會自動被清理。

  從更高一個層次看,這就是所有存在內存管的語言對內存泄漏所考慮的事情,剩余的對象引用將不再會被使用。

  典型泄漏

  既然我們知道了在java中確實會存在內存泄漏,那么就讓我們看一些典型的泄漏,并找出他們發生的原因。

  全局集合

  在大型應用程序中存在各種各樣的全局數據倉庫是很普遍的,比如一個JNDI-tree或者一個session table。在這些情況下,注重力就被放在了治理數據倉庫的大小上。當然是有一些適當的機制可以將倉庫中的無用數據移除。

  可以有很多不同的解決形式,其中最常用的是一種周期運行的清除作業。這個作業會驗證倉庫中的數據然后清除一切不需要的數據。
另一個辦法是使用引用計算。集合用來對了解每個集合入口關聯器(referrer)的數目負責。這要求關聯器通知集合什么時候完成進入。當關聯器的數目為零時,就可以移除集合中的相關元素。

  高速緩存

  高速緩存是一種用來快速查找已經執行過的操作結果的數據結構。因此,假如一個操作執行很慢的話,你可以先把普通輸入的數據放入高速緩存,然后過些時間再調用高速緩存中的數據。

  高速緩存多少還有一點動態實現的意思,當數據操作完畢,又被送入高速緩存。一個典型的算法如下所示:

  1.檢查結果是否在高速緩存中,存在則返回結果;

  2.假如結果不在,那么計算結果;

  3.將結果放入高速緩存,以備將來的操作調用。

  這個算法的問題(或者說潛在的內存泄漏)在最后一步。假如操作伴隨著一個不同的,輸入非常大的數字,那么存入高速緩存的也是一個非常大的結果。那么這個方法就不是能夠勝任的了。

  為了避免這種潛在的致命錯誤設計,程序就必須確定高速緩存在他所使用的內存中有一個上界。因此,更好的算法是:

  1.檢查結果是否在高速緩存中,存在則返回結果;

  2.假如結果不在,那么計算結果;

  3.假如高速緩存所占空間過大,移除緩存中舊的結果;

  4.將結果放入高速緩存,以備將來的操作調用。

  通過不斷的從緩存中移除舊的結果,我們可以假設,將來,最新輸入的數據可能被重用的幾率要遠遠大于舊的結果。這通常是一個不錯的設想。

  這個新的算法會確保高速緩存的容量在預先確定的范圍內。精確的范圍是很難計算的,因為緩存中的對象存在引用時將繼續有效。正確的劃分高速緩存的大小是一個復雜的任務,你必須權衡可使用內存大小和數據快速存取之間的矛盾。

  另一個解決這個問題的途徑是使用java.lang.ref.SoftReference類堅持將對象放入高速緩存。這個方法可以保證當虛擬機用完內存或者需要更多堆的時候,可以釋放這些對象的引用。

  類裝載器

  Java類裝載器創建就存在很多導致內存泄漏的漏洞。由于類裝載器的復雜結構,使得很難得到內存泄漏的透視圖。這些困難不僅僅是由于類裝載器只與"普通的"對象引用有關,同時也和對象內部的引用有關,比如數據變量,方法和各種類。這意味著只要存在對數據變量,方法,各種類和對象的類裝載器,那么類裝載器將駐留在JVM中。既然類裝載器可以同很多的類關聯,同時也可以和靜態數據變量關聯,那么相當多的內存就可能發生泄漏。

  定位內存泄漏

  經常地,程序內存泄漏的最初跡象發生在出錯之后,得到一個OutOfMemoryError在你的程序中。這種典型地情況發生在產品環境中,而在那里,你希望內存泄漏盡可能的少,調試的可能性也達到最小。也許你的測試環境和產品的系統環境不盡相同,導致泄露的只會在產品中揭示。這種情況下,你需要一個低內務操作工具來監聽和尋找內存泄漏。同時,你還需要把這個工具同你的系統聯系起來,而不需要重新啟動他或者機械化你的代碼。也許更重要的是,當你做分析的時候,你需要能夠同工具分離而使得系統不會受到干擾。

  一個OutOfMemoryError經常是內存泄漏的一個標志,有可能應用程序的確用了太多的內存;這個時候,你既不能增加JVM的堆的數量,也不能改變你的程序而使得他減少內存使用。但是,在大多數情況下,一個OutOfMemoryError是內存泄漏的標志。一個解決辦法就是繼續監聽GC的活動,看看隨時間的流逝,內存使用量是否會增加,假如有,程序中一定存在內存泄漏。

  具體輸出

  有很多辦法來監聽垃圾回收器的活動。也許運用最廣泛的就是以:-Xverbose:gc選項運行JVM,然后觀察輸出結果一段時間。

[memory] 10.109-10.235: GC 65536K->16788K (65536K), 126.000 ms

  箭頭后的值(在這個例子中 16788K)是垃圾回收后堆的使用量。

  控制臺

  觀察這些無盡的GC具體統計輸出是一件非常單調乏味的事情。好在有一些工具來代替我們做這些事情。The JRockit Management Console可以用圖形的方式輸出堆的使用量。通過觀察圖像,我們可以很方便的觀察堆的使用量是否伴隨時間增長。

輕松搞定Java內存泄漏(圖一)
Figure 1. The JRockit Management Console



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久免费精品| 欧美色另类天堂2015| 97超级碰碰碰久久久| 国自在线精品视频| 中文字幕亚洲字幕| 亚洲区免费影片| 欧美性xxxx极品hd满灌| 国产精品久久77777| 亚洲一区二区三区香蕉| 国产视频久久久久久久| 国产999精品久久久影片官网| 不卡av日日日| 中文字幕日韩免费视频| 欧美精品在线播放| 欧美专区日韩视频| 精品一区电影国产| 日本久久久a级免费| 欧美日韩在线第一页| 国产成人精品一区二区三区| 日本高清视频一区| 亚洲精品视频在线播放| 亚洲片在线资源| 国产成人亚洲综合91精品| 久久免费精品日本久久中文字幕| 亚洲无线码在线一区观看| 欧美电影免费观看网站| 国产日韩欧美中文| 九九热r在线视频精品| 中文字幕国产日韩| 亚洲精品综合久久中文字幕| 亚洲片国产一区一级在线观看| 亚洲伊人一本大道中文字幕| 伊人久久精品视频| 国内精品久久久久伊人av| 精品人伦一区二区三区蜜桃免费| 少妇高潮久久77777| 视频在线观看99| 久久综合88中文色鬼| 亚洲国产精品电影| 午夜欧美不卡精品aaaaa| 国色天香2019中文字幕在线观看| 色久欧美在线视频观看| 久久久久久国产精品| 国产精品91视频| 精品一区精品二区| 日本a级片电影一区二区| 日韩av一区在线| 国产亚洲精品综合一区91| 久久久久久久久久久久av| 欧美成人免费全部观看天天性色| 成人欧美一区二区三区黑人| 亚洲欧美激情精品一区二区| 国产精品久久91| 国产精品高潮呻吟久久av无限| 日韩国产欧美精品在线| 国产精品人成电影| 国产精品久久久久久久久免费看| 欧美激情久久久久久| 美日韩丰满少妇在线观看| 亚洲国产精品网站| 日本一区二区在线免费播放| 国产精品视频一| 亚洲欧美国产精品专区久久| 在线亚洲午夜片av大片| 久久久久久网站| 精品成人在线视频| 日韩在线视频观看| 日韩视频中文字幕| 国产日韩欧美综合| 尤物tv国产一区| 久久久国产影院| 成人欧美一区二区三区在线湿哒哒| 国产成人av网址| 尤物yw午夜国产精品视频明星| 欧美日韩在线视频一区二区| 欧美日韩色婷婷| 日韩av高清不卡| 国产精品高清免费在线观看| 成人av.网址在线网站| 成人亚洲欧美一区二区三区| 国产免费一区二区三区在线能观看| 欧美激情在线播放| 亚洲美女视频网站| 亚洲人在线观看| 日韩在线高清视频| 亚洲美女免费精品视频在线观看| 国产成人精品免高潮费视频| 欧美激情一级欧美精品| 欧美一区二区三区四区在线| 亚洲午夜小视频| 日韩在线免费观看视频| 91夜夜揉人人捏人人添红杏| 国产精品久久久一区| 国产精品久久97| 久久久久这里只有精品| 国产亚洲欧美一区| 成人久久久久爱| 欧美精品激情blacked18| 日韩在线高清视频| 亚洲男人天堂视频| 亚洲精品一区中文字幕乱码| 伊人久久综合97精品| 亚洲第一区在线观看| 精品久久久久久久久久久久久久| 欧美性猛交xxxxx免费看| 亚洲美女av网站| 91精品啪在线观看麻豆免费| 欧美日韩在线第一页| 亚洲色图35p| 国产精品草莓在线免费观看| 91亚洲精品一区二区| 一本色道久久88综合日韩精品| 日韩激情视频在线播放| 91免费在线视频| 欧日韩不卡在线视频| 欧美性受xxxx白人性爽| 欧美精品日韩www.p站| 国产精品福利在线观看| 成人福利视频网| 亚洲精品久久久久中文字幕二区| 成人h视频在线观看播放| 亚洲免费视频网站| 91久久久久久久久久久久久| 麻豆国产va免费精品高清在线| 精品美女久久久久久免费| 狠狠躁夜夜躁久久躁别揉| 国产精品久久久久久久av电影| 欧美激情啊啊啊| 中文字幕精品在线| 国产欧美精品一区二区三区介绍| 国产精品免费久久久久久| 欧美激情在线狂野欧美精品| 亚洲国产天堂久久国产91| 欧美成人精品三级在线观看| 亚洲va久久久噜噜噜| 在线国产精品播放| 92版电视剧仙鹤神针在线观看| 国外日韩电影在线观看| 亚洲一区亚洲二区亚洲三区| 国产欧美va欧美va香蕉在线| 国产精品久久77777| www.久久久久| 欧美一区二区三区……| 成人免费直播live| 欧美亚洲日本网站| 91经典在线视频| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧洲美女7788成人免费视频| 青青草精品毛片| 青青在线视频一区二区三区| 国产精品久久久久久久一区探花| 国内免费久久久久久久久久久| 欧美激情乱人伦| 国产ts一区二区| 俺也去精品视频在线观看| 欧洲一区二区视频| 中文字幕精品一区二区精品| 国产精品女人久久久久久| 一本色道久久综合狠狠躁篇的优点| 7777免费精品视频| 中文字幕亚洲欧美日韩高清| 欧美美女操人视频| 精品视频一区在线视频| 日韩毛片在线看|