Java内存泄漏问题
生活随笔
收集整理的這篇文章主要介紹了
Java内存泄漏问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1:java中垃圾回收機制主要完成下面兩件事情:
- 跟蹤并監控每個java對象,當某個對象處于不可達狀態時,回收該對象所占的內存
- 清理內存分配,回收過程中產生的內存碎片
2:對于JVM的垃圾回收機制來說,是否回收一個對象的標準是:
是否還有引用變量引用該對象?
???? 只要還有引用變量引用該對象,立即回收機制就不會回收它。
3:基本上,可以把JVM內存中對象引用理解成一種有向圖,把引用變量,對象都當成為有向圖的頂點,將引用關系當成圖的有向邊,有向邊總是從引用端指向被引用的對象。
??? 因為java所有對象都是由一條一條線程創建出來的,因此可以將線程對象當成有向圖的起點。如果某個對象在這個有向圖中處于不可達的狀態,那么就認為該對象不再被引用,
??? 接下來垃圾回收機制就回去主動回收它。
?? 以下面程序為例:
1 class Node 2 { 3 Node next; 4 String name; 5 public Node(String name) 6 { 7 this.name = name; 8 } 9 } 10 public class NodeTest 11 { 12 public static void main(String[] args) 13 { 14 Node n1 = new Node("第一個節點"); 15 Node n2 = new Node("第二個節點"); 16 Node n3 = new Node("第三個節點"); 17 n1.next = n2; 18 n2 = null; 19 n3 = n2; 20 } 21 } 22 從下圖可以看出,從main頂點出發有一條路徑到達“第一個節點”,因此該對象處于可達狀態,垃圾回收機制不會回收它。 23 從main開始有兩條路徑到達“第二個節點”,因此該對象也處于可達狀態,垃圾回收機制也不會回收它。 24 從Main頂點開始,沒有路徑到達“第三個節點”,因此該對象就變成了垃圾。 25 26 27 內存管理的小技巧 28 29 盡量使用直接量 30 31 當需要使用字符串,還有其他如Byte,Short,Integer,Long,Float,Double,Boolean,Character包裝類的實例時,程序不應該采用new的方式來創建對象,而應該采用直接量來創建它們 32 例如:程序需要"hello"字符串,應采用下面的代碼: 33 String str = "hello"; 34 上面的代碼會創建一個"hello"的字符串,而且jvm的字符串緩存池還會緩存這個對象 35 但如果使用下面的代碼: 36 String str = new String("hello"); 37 此時程序同樣創建了一個緩存在字符串緩存池中的"hello"字符串,除此之外str所引用的String對象底層還包含一個char[]數組,這個數組依次存放h,e,l,l,o等字符。 38 39 2:使用StringBuffer和StringBuilder進行字符串連接 40 如果程序使用多個String對象進行字符串連接,在運行時將生成大量的臨時字符串對象,這些字符串會保存在內存中從而導致程序性能下降 41 3:盡量少用靜態變量 42 例如下面代碼: 43 class Person{ 44 static Object obj = new Object(); 45 } 46 obj變量時Person類的靜態變量,因此它的生命周期與Person同步,在Person類不被卸載的情況下,Person類對應的Class對象會常駐內存,直到程序運行結束。 47 因此obj所引用的Object對象一旦被創建,也會常駐內存,直到運行結束。 48 4:盡早釋放無用對象的引用 49 5:避免在經常調用的方法,循環中創建java對象 50 6:緩存經常使用的對象 51 典型的緩存就是數據庫連接池,數據庫連接池中緩存了大量數據庫連接,每次程序訪問數據庫時只要直接取得連接就好。注:本文來源于:cnblogs:牛奶、不加糖
總結
以上是生活随笔為你收集整理的Java内存泄漏问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《社交网站界面设计(原书第2版)》——2
- 下一篇: 【iCore1S 双核心板_ARM】例程