内存泄漏的常见应用领域
1.Java內存泄漏是每個Java程序員都會遇到的問題,程序在本地運行一切正常,可是布署到遠端就會出現(xiàn)內存無限制的增長,最后系統(tǒng)癱瘓,那么如何最快最好的檢測程序的穩(wěn)定性,防止系統(tǒng)崩盤,作者用自已的親身經歷與各位網友分享解決這些問題的辦法。
2.嵌入式設備
3.在進入測試過程中,我們發(fā)現(xiàn)有一個程序模塊系統(tǒng)內存和CPU資源消耗急劇增加,持續(xù)增長到出現(xiàn)java.lang.OutOfMemoryError為止。經過分析Java內存泄漏是破壞系統(tǒng)的主要因素。這里與大家分享我們在開發(fā)過程中遇到的Java內存泄漏的檢測和處理解決過程。
4.在Java中,內存的分配是由程序完成的,而內存的釋放是由垃圾收集器(Garbage Collection,GC)完成的,程序員不需要通過調用函數來釋放內存,但它只能回收無用并且不再被其它對象引用的那些對象所占用的空間。
5.
三、幾種典型的內存泄漏
我們知道了在Java中確實會存在內存泄漏,那么就讓我們看一看幾種典型的泄漏,并找出他們發(fā)生的原因和解決方法。
3.1 全局集合
在大型應用程序中存在各種各樣的全局數據倉庫是很普遍的,比如一個JNDI-tree或者一個session table。在這些情況下,必須注意管理儲存庫的大小。必須有某種機制從儲存庫中移除不再需要的數據。
通常有很多不同的解決形式,其中最常用的是一種周期運行的清除作業(yè)。這個作業(yè)會驗證倉庫中的數據然后清除一切不需要的數據。
另一種管理儲存庫的方法是使用反向鏈接(referrer)計數。然后集合負責統(tǒng)計集合中每個入口的反向鏈接的數目。這要求反向鏈接告訴集合何時會退出入口。當反向鏈接數目為零時,該元素就可以從集合中移除了。
3.2 緩存
緩存一種用來快速查找已經執(zhí)行過的操作結果的數據結構。因此,如果一個操作執(zhí)行需要比較多的資源并會多次被使用,通常做法是把常用的輸入數據的操作結果進行緩存,以便在下次調用該操作時使用緩存的數據。緩存通常都是以動態(tài)方式實現(xiàn)的,如果緩存設置不正確而大量使用緩存的話則會出現(xiàn)內存溢出的后果,因此需要將所使用的內存容量與檢索數據的速度加以平衡。
常用的解決途徑是使用java.lang.ref.SoftReference類堅持將對象放入緩存。這個方法可以保證當虛擬機用完內存或者需要更多堆的時候,可以釋放這些對象的引用。
3.3 類裝載器
Java類裝載器的使用為內存泄漏提供了許多可乘之機。一般來說類裝載器都具有復雜結構,因為類裝載器不僅僅是只與"常規(guī)"對象引用有關,同時也和對象內部的引用有關。比如數據變量,方法和各種類。這意味著只要存在對數據變量,方法,各種類和對象的類裝載器,那么類裝載器將駐留在JVM中。既然類裝載器可以同很多的類關聯(lián),同時也可以和靜態(tài)數據變量關聯(lián),那么相當多的內存就可能發(fā)生泄漏。
?
5.
四、如何檢測和處理內存泄漏
如何查找引起內存泄漏的原因一般有兩個步驟:第一是安排有經驗的編程人員對代碼進行走查和分析,找出內存泄漏發(fā)生的位置;第二是使用專門的內存泄漏測試工具進行測試。
第一個步驟在代碼走查的工作中,可以安排對系統(tǒng)業(yè)務和開發(fā)語言工具比較熟悉的開發(fā)人員對應用的代碼進行了交叉走查,盡量找出代碼中存在的數據庫連接聲明和結果集未關閉、代碼冗余等故障代碼。
第二個步驟就是檢測Java的內存泄漏。在這里我們通常使用一些工具來檢查Java程序的內存泄漏問題。市場上已有幾種專業(yè)檢查Java內存泄漏的工具,它們的基本工作原理大同小異,都是通過監(jiān)測Java程序運行時,所有對象的申請、釋放等動作,將內存管理的所有信息進行統(tǒng)計、分析、可視化。開發(fā)人員將根據這些信息判斷程序是否有內存泄漏問題。這些工具包括Optimizeit Profiler,JProbe Profiler,JinSight , Rational 公司的Purify等。
?
?
怎樣阻止內存泄露
1.使用List、Map等集合時,在使用完成后賦值為null
2.使用大對象時,在用完后賦值為null
3.目前已知的jdk1.6的substring()方法會導致內存泄露
4.避免一些死循環(huán)等重復創(chuàng)建或對集合添加元素,撐爆內存
5.簡潔數據結構、少用靜態(tài)集合等
6.及時的關閉打開的文件,socket句柄等
7.多關注事件監(jiān)聽(listeners)和回調(callbacks),比如注冊了一個listener,當它不再被使用的時候,忘了注銷該listener,可能就會產生內存泄露
總結
以上是生活随笔為你收集整理的内存泄漏的常见应用领域的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL的insert ignore与
- 下一篇: 带你走进rsync的世界