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

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

Java人員談論內存泄露問題分析

2019-11-18 13:09:17
字體:
來源:轉載
供稿:網友

  很多人在談論內存泄露問題,當然對于c/c++來說,這個應該是老掉牙的問題,但是很多java人員也越來越多得討論這個問題,我這里寫個小結,希望對大家有一定的參考價值。
  
  內存泄漏的慨念
  1.c/c++是程序員自己治理內存,Java內存是由GC自動回收的。
  
  我雖然不是很熟悉C++,不過這個應該沒有犯常識性錯誤吧。
  
  2.什么是內存泄露?
  
  內存泄露是指系統中存在無法回收的內存,有時候會造成內存不足或系統崩潰。
  
  在C/C++中分配了內存不釋放的情況就是內存泄露。
  
  3.Java存在內存泄露
  
  我們必須先承認這個,才可以接著討論。雖然Java存在內存泄露,但是基本上不用很關心它,非凡是那些對代碼本身就不講究的就更不要去關心這個了。
  
  Java中的內存泄露當然是指:存在無用但是垃圾回收器無法回收的對象。而且即使有內存泄露問題存在,也不一定會表現出來。
  
  4.Java中參數都是傳值的。
  
  對于基本類型,大家基本上沒有異議,但是對于引用類型我們也不能有異議。
  
  Java內存泄露情況
  JVM回收算法是很復雜的,我也不知道他們怎么實現的,但是我只知道他們要實現的就是:對于沒有被引用的對象是可以回收的。所以你要造成內存泄露就要做到:
  
  持有對無用對象的引用!
  
  不要以為這個很輕易做到,既然無用,你怎么還會持有它的引用? 既然你還持有它,它怎么會是無用的呢?
  
  我實在想不到比那個堆棧更經典的例子了,以致于我還要引用別人的例子,下面的例子不是我想到的,是書上看到的,當然假如沒有在書上看到,可能過一段時間我自己也想的到,可是那時我說是我自己想到的也沒有人相信的。
  
  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的內存泄露問題幾乎可以忽略了,但是知道的人就不要犯了。
  
  不知者無罪!Java存在內存泄露,但是也不要夸大其辭。假如你對Java都不是很熟,你根本就不用關心這個,我說過你無意中寫出內存泄露的例子就像你中一千萬一樣概率小,開玩笑了,其實應該是小的多的多!
  
  而且即使你有幸寫出這樣的代碼,中獎了!基本上都是一包洗衣粉,不會讓你發財,對系統沒有什么大的影響。
  
  杞人憂天的情況
  1.無話可說型
  
  Object obj=new Object();
  obj=null;
  //這個完全多此一舉,因為退出了作用范圍,對象的引用自動消失
  //不要在你的程序中出現這樣的語句,沒有錯,但是就是不雅觀
  
  2.思考不對型
  
  void func(Object o){
  o=new Object();
  return
  }
  
  當我們知道Java參數是傳值,就知道上面的方法什么也沒錯,就是申請了一個對象然后再丟給GC。因為是傳值,這里的o是一個調用時候的拷貝,會不會無法回收?不就是拷貝嗎,退出方法什么都沒了,這個對象怎么會留的住。
  
  3.盡量避免型
  
  class A{
  B b=new B(this);
  }
  class B{
  A a;
  B(A a){this.a=a;}
  }
  
  這個存在互相引用,可能導致孤島現象,但是這個不會造成內存泄露不過我自己覺得這個會降低GC的效率,就從我的智力來看,我覺得這種情況比一般情況難以判定怎么回收!當然GC比我聰明,不過應該也要動一點腦子吧。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩高清人体午夜| 欧美成人激情在线| 日韩中文在线视频| 欧美精品久久久久久久久| 亚洲欧美日韩中文在线| 亚洲欧美精品一区二区| 欧洲一区二区视频| 日韩中文字幕在线视频播放| 亚洲精品久久久久久久久久久久| 黄色一区二区在线观看| 欧美大片免费看| 亚洲精品美女在线| 亚洲精品v天堂中文字幕| 欧美日韩999| 日韩av高清不卡| 黑人巨大精品欧美一区二区| 少妇高潮久久77777| 欧美性生交大片免费| 精品国产福利在线| 91久久国产精品| 国产精品视频永久免费播放| 国产精品久久久久久久久久99| 国产精自产拍久久久久久蜜| 最新亚洲国产精品| 日产精品久久久一区二区福利| 亚洲第一二三四五区| 久国内精品在线| 国产美女扒开尿口久久久| 久久伊人91精品综合网站| 亚洲石原莉奈一区二区在线观看| 国内揄拍国内精品少妇国语| 91伊人影院在线播放| 久久精品成人欧美大片| 欧美极品少妇xxxxx| 欧美成人午夜激情| 国产一区二区三区高清在线观看| 亚洲成色777777女色窝| 日韩高清免费观看| 欧美大片第1页| 日韩一区二区av| 久久精品在线视频| 日韩国产欧美精品一区二区三区| 国产美女精品免费电影| 日韩av在线直播| 国产精品久久久久久中文字| 久久天天躁狠狠躁夜夜躁2014| 日韩av成人在线观看| 欧美在线免费观看| 97视频在线观看免费高清完整版在线观看| 亚洲国产精品高清久久久| 国产精品美女999| 亚洲最大成人网色| 91精品国产91久久久久久不卡| 亚洲综合中文字幕在线| 亚洲视频在线观看免费| 亚洲精品成a人在线观看| 97精品国产97久久久久久春色| 亚洲精品国产精品自产a区红杏吧| 欧美日韩999| 一区二区三区 在线观看视| 性金发美女69hd大尺寸| 久久久www成人免费精品| 影音先锋欧美精品| 青草热久免费精品视频| 韩日精品中文字幕| 国产精品三级网站| 欧洲午夜精品久久久| 国产精品精品视频一区二区三区| 91影院在线免费观看视频| 亚洲电影免费观看高清完整版| 成人激情视频在线播放| 91视频88av| 国产成人综合精品| 国产精品久久久久7777婷婷| 久久精品91久久香蕉加勒比| 亚洲国产精品美女| 国产成人在线一区| 日本精品视频在线观看| 久久99热精品| 日韩免费在线电影| 国产精品极品美女在线观看免费| 欧美高清在线视频观看不卡| 久久久中精品2020中文| 亚洲综合精品一区二区| 自拍偷拍免费精品| 欧美日韩在线一区| 亚洲大尺度美女在线| 38少妇精品导航| 久久久伊人欧美| 国产精品极品尤物在线观看| 久久久久www| 亚洲综合在线做性| 国产精品99蜜臀久久不卡二区| 中文字幕亚洲国产| 久久青草福利网站| 国产成人一区二区三区| 国产午夜精品久久久| 尤物yw午夜国产精品视频明星| 日韩成人av网| 日本久久久久久久久| 久久99国产精品久久久久久久久| 久久精品中文字幕| 久久这里有精品视频| 日韩在线观看视频免费| 两个人的视频www国产精品| 欧美视频二区36p| 久久噜噜噜精品国产亚洲综合| 欧美一级免费视频| 成人网在线免费观看| 国产成人欧美在线观看| 日韩av网站在线| 日韩精品在线播放| 久久国产精品99国产精| 精品国产精品自拍| 亚洲影院污污.| 亚洲在线视频福利| 亚洲第一区第二区| 亚洲三级黄色在线观看| 欧美人在线观看| 欧美亚洲国产日韩2020| 日韩欧美在线观看| 国产一区二区黄| 国产99久久久欧美黑人| 高清日韩电视剧大全免费播放在线观看| 欧美激情一区二区三级高清视频| 国产精品大片wwwwww| 精品免费在线视频| 日韩高清不卡av| 超碰91人人草人人干| 91精品视频免费观看| 亚洲精品在线不卡| 国产精品久久久一区| 性欧美在线看片a免费观看| 国产精品视频内| 日韩精品有码在线观看| 久久天天躁狠狠躁夜夜躁2014| 日韩精品视频在线免费观看| 狠狠操狠狠色综合网| 欧美在线激情视频| 亚洲天堂免费观看| 欧美在线亚洲一区| 91精品国产777在线观看| 欧美日韩国产在线播放| 日韩美女视频在线观看| 欧美性猛交xxxx黑人猛交| 国语自产精品视频在免费| 久久九九全国免费精品观看| 久久99久久99精品免观看粉嫩| 91精品国产乱码久久久久久久久| 中文字幕不卡在线视频极品| 欧美特级www| 国产999在线| 国产精品丝袜久久久久久不卡| 亚洲a成v人在线观看| 成人自拍性视频| 国产日产久久高清欧美一区| 亚洲欧美另类人妖| 色av吧综合网| 欧美日韩国产综合新一区| 久久久久久久激情视频| 国产日韩换脸av一区在线观看| 欧美日韩国产影院| 日韩亚洲精品视频| 欧美裸体xxxx极品少妇|