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

首頁 > 編程 > Java > 正文

淺談Java編程中的內存泄露情況

2019-11-26 14:54:58
字體:
來源:轉載
供稿:網友

必須先要了解的
1。c/c++是程序員自己管理內存,Java內存是由GC自動回收的。
我雖然不是很熟悉C++,不過這個應該沒有犯常識性錯誤吧。
2。什么是內存泄露?
內存泄露是指系統中存在無法回收的內存,有時候會造成內存不足或系統崩潰。
在C/C++中分配了內存不釋放的情況就是內存泄露。
3。Java存在內存泄露
我們必須先承認這個,才可以接著討論。雖然Java存在內存泄露,但是基本上不用很關心它,特別是那些對代碼本身就不講究的就更不要去關心這個了。
Java中的內存泄露當然是指:存在無用但是垃圾回收器無法回收的對象。
而且即使有內存泄露問題存在,也不一定會表現出來。
4。Java中參數都是傳值的。
對于基本類型,大家基本上沒有異議,但是對于引用類型我們也不能有異議。
 

Java內存泄露情況
 
1、堆內存溢出(outOfMemoryError:java heap space)
       在jvm規范中,堆中的內存是用來生成對象實例和數組的。
       如果細分,堆內存還可以分為年輕代和年老代,年輕代包括一個eden區和兩個survivor區。
       當生成新對象時,內存的申請過程如下:
          a、jvm先嘗試在eden區分配新建對象所需的內存;
          b、如果內存大小足夠,申請結束,否則下一步;
          c、jvm啟動youngGC,試圖將eden區中不活躍的對象釋放掉,釋放后若Eden空間仍然不足以放入新對象,則試圖將部分Eden中活躍對象放入Survivor區;
          d、Survivor區被用來作為Eden及old的中間交換區域,當OLD區空間足夠時,Survivor區的對象會被移到Old區,否則會被保留在Survivor區;
          e、 當OLD區空間不夠時,JVM會在OLD區進行full GC;
          f、full GC后,若Survivor及OLD區仍然無法存放從Eden復制過來的部分對象,導致JVM無法在Eden區為新對象創建內存區域,則出現”out of memory錯誤”:
                                 

 outOfMemoryError:java heap space

2、方法區內存溢出(outOfMemoryError:permgem space)
       在jvm規范中,方法區主要存放的是類信息、常量、靜態變量等。
       所以如果程序加載的類過多,或者使用反射、gclib等這種動態代理生成類的技術,就可能導致該區發生內存溢出,一般該區發生內存溢出時的錯誤信息為:

       outOfMemoryError:permgem space

3、線程棧溢出(java。lang。StackOverflowError)
       線程棧時線程獨有的一塊內存結構,所以線程棧發生問題必定是某個線程運行時產生的錯誤。
       一般線程棧溢出是由于遞歸太深或方法調用層級過多導致的。
       發生棧溢出的錯誤信息為:

       java。lang。StackOverflowError

內存泄露的幾種場景:
 
1、長生命周期的對象持有短生命周期對象的引用
 
            這是內存泄露最常見的場景,也是代碼設計中經常出現的問題。
            例如:在全局靜態map中緩存局部變量,且沒有清空操作,隨著時間的推移,這個map會越來越大,造成內存泄露。
 
2、修改hashset中對象的參數值,且參數是計算哈希值的字段
 
             當一個對象被存儲進HashSet集合中以后,就不能修改這個對象中的那些參與計算哈希值的字段,否則對象修改后的哈希值與最初存儲進HashSet集合中時的哈希值就不同了,在這種情況下,即使在contains方法使用該對象的當前引用作為參數去HashSet集合中檢索對象,也將返回找不到對象的結果,這也會導致無法從HashSet集合中刪除當前對象,造成內存泄露。
 
3、機器的連接數和關閉時間設置
 
            長時間開啟非常耗費資源的連接,也會造成內存泄露。


 
來看個內存泄露的例子:

public class Stack { private Object[] elements=new Object[10]; private int size = 0;  public void push(Object e){ ensureCapacity(); elements[size++] = e;  }  public Object pop(){ if( size == 0)   throw new EmptyStackException();  return elements[--size]; }  private void ensureCapacity(){ if(elements。length == size){  Object[] oldElements = elements;  elements = new Object[2 * elements。length+1];  System。arraycopy(oldElements,0, elements, 0, size); } }}

上面的原理應該很簡單,假如堆棧加了10個元素,然后全部彈出來,雖然堆棧
是空的,沒有我們要的東西,但是這是個對象是無法回收的,這個才符合了內存
泄露的兩個條件:無用,無法回收。
 

但是就是存在這樣的東西也不一定會導致什么樣的后果,如果這個堆棧用的比較少,
也就浪費了幾個K內存而已,反正我們的內存都上G了,哪里會有什么影響,再說
這個東西很快就會被回收的,有什么關系。下面看兩個例子。
 
例子1

public class Bad{  public static Stack s=Stack();  static{    s。push(new Object());    s。pop(); //這里有一個對象發生內存泄露    s。push(new Object()); //上面的對象可以被回收了,等于是自愈了  }}


因為是static,就一直存在到程序退出,但是我們也可以看到它有自愈功能,
就是說如果你的Stack最多有100個對象,那么最多也就只有100個對象無法被回收
其實這個應該很容易理解,Stack內部持有100個引用,最壞的情況就是他們都是
無用的,因為我們一旦放新的進取,以前的引用自然消失!
 
例子2

public class NotTooBad{  public void doSomething(){    Stack s=new Stack();    s。push(new Object());    //other code    s。pop();//這里同樣導致對象無法回收,內存泄露。  }//退出方法,s自動無效,s可以被回收,Stack內部的引用自然沒了,所以   //這里也可以自愈,而且可以說這個方法不存在內存泄露問題,不過是晚一點   //交給GC而已,因為它是封閉的,對外不開放,可以說上面的代碼99。9999%的   //情況是不會造成任何影響的,當然你寫這樣的代碼不會有什么壞的影響,但是   //絕對可以說是垃圾代碼!沒有矛盾吧,我在里面加一個空的for循環也不會有   //什么太大的影響吧,你會這么做嗎?}

 
上面兩個例子都不過是小打小鬧,但是C/C++中的內存泄露就不是Bad了,而是Worst了。
他們如果一處沒有回收就永遠無法回收,頻繁的調用這個方法內存不就用光了!
因為Java還有自愈功能(我自己起的名字,還沒申請專利),所以Java的內存泄露問題
幾乎可以忽略了,但是知道的人就不要犯了。

為了避免內存泄露,在編寫代碼的過程中可以參考下面的建議:
 
1、盡早釋放無用對象的引用;
 
2、使用字符串處理,避免使用String,應大量使用StringBuffer,每一個String對象都得獨立占用內存一塊區域;
 
3、盡量少用靜態變量,因為靜態變量存放在永久代(方法區),永久代基本不參與垃圾回收;
 
4、避免在循環中創建對象;
 
5、開啟大型文件或從數據庫一次拿了太多的數據很容易造成內存溢出,所以在這些地方要大概計算一下數據量的最大值是多少,并且設定所需最小及最大的內存空間值。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲人成网站777色婷婷| 久久九九亚洲综合| 亚洲最大成人免费视频| 91精品国产自产在线观看永久| 久久久久久网站| 日韩成人在线视频| 国产视频在线观看一区二区| 欧美日韩国产综合视频在线观看中文| 国模gogo一区二区大胆私拍| 91精品国产自产在线观看永久| 日本伊人精品一区二区三区介绍| 日本午夜人人精品| 亚洲一区二区黄| 亚洲xxxxx性| 日韩av免费看网站| 怡红院精品视频| 亚洲欧美中文字幕在线一区| 欧美视频精品一区| 亚洲美女av在线| 亚洲精品电影久久久| 国产精品久久久久77777| 青青久久av北条麻妃黑人| 亚洲精品av在线播放| x99av成人免费| 久久艳片www.17c.com| 成人欧美一区二区三区黑人| 国产欧美久久一区二区| 亚洲天堂男人天堂| 91极品视频在线| 欧美日韩精品中文字幕| 深夜福利日韩在线看| 国自在线精品视频| 欧洲成人午夜免费大片| 日本aⅴ大伊香蕉精品视频| 97视频在线观看成人| 日本sm极度另类视频| 国产91ⅴ在线精品免费观看| 国产欧美日韩专区发布| 欧美午夜片在线免费观看| 欧美在线亚洲在线| 一本一本久久a久久精品综合小说| 色哟哟亚洲精品一区二区| 国产精品一区二区三区久久| 日韩欧美在线观看| 精品一区二区电影| 亚洲一区二区三区视频播放| 亚洲欧洲自拍偷拍| 国产区精品视频| 97精品在线观看| 亚洲free性xxxx护士hd| 成人精品久久一区二区三区| 亚洲人午夜精品免费| 久久艳片www.17c.com| 国产精品入口日韩视频大尺度| 亚洲在线第一页| 一本久久综合亚洲鲁鲁| www亚洲欧美| 亚洲a∨日韩av高清在线观看| 富二代精品短视频| 亚洲精品福利在线观看| 日韩中文字幕国产| 2019中文在线观看| 国产精品夜色7777狼人| 自拍偷拍免费精品| 国产精品www| 欧美激情按摩在线| 一区二区日韩精品| 中文字幕日韩在线观看| 高清日韩电视剧大全免费播放在线观看| 成人黄色短视频在线观看| 亚洲综合大片69999| 欧美专区在线视频| 国产精品久久久久久久久久久久久久| 日韩电影视频免费| 亚洲国产高清自拍| 尤物yw午夜国产精品视频明星| 欧美香蕉大胸在线视频观看| 爽爽爽爽爽爽爽成人免费观看| 亚洲男女自偷自拍图片另类| 国语对白做受69| 日本一区二区在线免费播放| 欧美日韩福利视频| 最近2019中文字幕大全第二页| 91在线免费视频| 国产欧美在线视频| 亚洲香蕉av在线一区二区三区| 精品久久久久久国产| 精品国产一区久久久| 国产欧美在线播放| 国产成人精品综合久久久| 美日韩精品免费视频| 国产伊人精品在线| 久久免费视频网| 精品国产一区二区三区在线观看| 亚洲在线免费看| 欧美精品在线免费播放| 亚洲女同精品视频| 亚洲国产三级网| 91日本在线观看| 日av在线播放中文不卡| 国产精品免费福利| 热re91久久精品国99热蜜臀| 欧美大片欧美激情性色a∨久久| 久久人91精品久久久久久不卡| 成人精品一区二区三区电影黑人| 日韩av免费看网站| 国产在线播放不卡| 亚洲一区二区三区四区视频| 91中文字幕一区| 久久网福利资源网站| 欧美在线视频一区二区| 欧美日韩国产激情| 日韩在线免费av| 亚洲高清一区二| 欧美高清在线视频观看不卡| 亚洲人成网站999久久久综合| 久久国产视频网站| 国产精品丝袜久久久久久不卡| 久久久久久久久久久网站| 国产精品久久视频| 日韩网站免费观看高清| 精品丝袜一区二区三区| 国产精品白丝jk喷水视频一区| 日韩欧美第一页| 国产亚洲综合久久| 亚洲精品99久久久久| 国产视频精品va久久久久久| 亚洲色图狂野欧美| 亚洲欧美成人一区二区在线电影| 久久国内精品一国内精品| 日韩成人在线视频观看| 精品久久久久久国产| 欧美在线www| 国产99视频在线观看| 国产偷国产偷亚洲清高网站| 成人黄色av网站| 日韩av在线网页| 亚洲成人av片在线观看| www亚洲欧美| 久久亚洲精品视频| 国产精品久久久久久久久| 一区二区三区 在线观看视| 亚洲女性裸体视频| 欧美日韩一区二区三区| 亚洲欧美精品一区二区| 欧美老女人性视频| 4438全国成人免费| 欧美激情久久久| 视频一区视频二区国产精品| 亚洲性线免费观看视频成熟| 综合av色偷偷网| 久久久久成人网| 欧洲亚洲免费视频| 成人激情视频小说免费下载| 欧美成人精品不卡视频在线观看| 永久免费精品影视网站| 国产精国产精品| 日韩中文字幕精品| 亚洲女人天堂视频| 亚洲xxxx在线| 在线精品播放av| 国产成人精品久久二区二区91| 亚洲国产精品高清久久久| 97国产一区二区精品久久呦|