<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    編程生活

       :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      113 隨筆 :: 0 文章 :: 18 評論 :: 0 Trackbacks
    并非本人原創.
    1.垃圾收集算法的核心思想

    Java語言建立了垃圾收集機制,用以跟蹤正在使用的對象和發現并回收不再使用(引用)的對象。該機制可以有效防范動態內存分配中可能發生的兩個危險:因內存垃圾過多而引發的內存耗盡,以及不恰當的內存釋放所造成的內存非法引用。

    垃圾收集算法的核心思想是:對虛擬機可用內存空間,即堆空間中的對象進行識別,如果對象正在被引用,那么稱其為存活對象,反之,如果對象不再被引用,則為垃圾對象,可以回收其占據的空間,用于再分配。垃圾收集算法的選擇和垃圾收集系統參數的合理調節直接影響著系統性能,因此需要開發人員做比較深入的了解。

    2.觸發主GC(Garbage Collector)的條件

    JVM進行次GC的頻率很高,但因為這種GC占用時間極短,所以對系統產生的影響不大。更值得關注的是主GC的觸發條件,因為它對系統影響很明顯。總的來說,有兩個條件會觸發主GC:

    ①當應用程序空閑時,即沒有應用線程在運行時,GC會被調用。因為GC在優先級最低的線程中進行,所以當應用忙時,GC線程就不會被調用,但以下條件除外。

    ②Java堆內存不足時,GC會被調用。當應用線程在運行,并在運行過程中創建新對象,若這時內存空間不足,JVM就會強制地調用GC線程,以便回收內存用于新的分配。若GC一次之后仍不能滿足內存分配的要求,JVM會再進行兩次GC作進一步的嘗試,若仍無法滿足要求,則 JVM將報“out of memory”的錯誤,Java應用將停止。

    由于是否進行主GC由JVM根據系統環境決定,而系統環境在不斷的變化當中,所以主GC的運行具有不確定性,無法預計它何時必然出現,但可以確定的是對一個長期運行的應用來說,其主GC是反復進行的。

    3.減少GC開銷的措施

    根據上述GC的機制,程序的運行會直接影響系統環境的變化,從而影響GC的觸發。若不針對GC的特點進行設計和編碼,就會出現內存駐留等一系列負面影響。為了避免這些影響,基本的原則就是盡可能地減少垃圾和減少GC過程中的開銷。具體措施包括以下幾個方面:

    (1)不要顯式調用System.gc()

    此函數建議JVM進行主GC,雖然只是建議而非一定,但很多情況下它會觸發主GC,從而增加主GC的頻率,也即增加了間歇性停頓的次數。

    (2)盡量減少臨時對象的使用

    臨時對象在跳出函數調用后,會成為垃圾,少用臨時變量就相當于減少了垃圾的產生,從而延長了出現上述第二個觸發條件出現的時間,減少了主GC的機會。

    (3)對象不用時最好顯式置為Null

    一般而言,為Null的對象都會被作為垃圾處理,所以將不用的對象顯式地設為Null,有利于GC收集器判定垃圾,從而提高了GC的效率。

    (4)盡量使用StringBuffer,而不用String來累加字符串(詳見blog另一篇文章JAVA中String與StringBuffer)

    由于String是固定長的字符串對象,累加String對象時,并非在一個String對象中擴增,而是重新創建新的String對象,如Str5=Str1+Str2+Str3+Str4,這條語句執行過程中會產生多個垃圾對象,因為對次作“+”操作時都必須創建新的String對象,但這些過渡對象對系統來說是沒有實際意義的,只會增加更多的垃圾。避免這種情況可以改用StringBuffer來累加字符串,因StringBuffer是可變長的,它在原有基礎上進行擴增,不會產生中間對象。

    (5)能用基本類型如Int,Long,就不用Integer,Long對象

    基本類型變量占用的內存資源比相應對象占用的少得多,如果沒有必要,最好使用基本變量。

    (6)盡量少用靜態對象變量

    靜態變量屬于全局變量,不會被GC回收,它們會一直占用內存。

    (7)分散對象創建或刪除的時間

    集中在短時間內大量創建新對象,特別是大對象,會導致突然需要大量內存,JVM在面臨這種情況時,只能進行主GC,以回收內存或整合內存碎片,從而增加主GC的頻率。集中刪除對象,道理也是一樣的。它使得突然出現了大量的垃圾對象,空閑空間必然減少,從而大大增加了下一次創建新對象時強制主GC的機會。

    4.gc與finalize方法

    ⑴gc方法請求垃圾回收

    使用System.gc()可以不管JVM使用的是哪一種垃圾回收的算法,都可以請求Java的垃圾回收。需要注意的是,調用System.gc()也僅僅是一個請求。JVM接受這個消息后,并不是立即做垃圾回收,而只是對幾個垃圾回收算法做了加權,使垃圾回收操作容易發生,或提早發生,或回收較多而已。

    ⑵finalize方法透視垃圾收集器的運行

    在JVM垃圾收集器收集一個對象之前 ,一般要求程序調用適當的方法釋放資源,但在沒有明確釋放資源的情況下,Java提供了缺省機制來終止化該對象釋放資源,這個方法就是finalize()。它的原型為:

    protected void finalize() throws Throwable

    在finalize()方法返回之后,對象消失,垃圾收集開始執行。原型中的throws Throwable表示它可以拋出任何類型的異常。

    因此,當對象即將被銷毀時,有時需要做一些善后工作。可以把這些操作寫在finalize()方法里。

    以下是引用片段:


    protected void finalize()
      {
      // finalization code here
      }


    ⑶代碼示例

    以下是引用片段:


    class Garbage
      {
      int index;
      static int count;
      Garbage()
      {
      count++;
      System.out.println("object "+count+" construct");
      setID(count);
      }
      void setID(int id)
      {
      index=id;
      }
      protected void finalize() //重寫finalize方法
      {
      System.out.println("object "+index+" is reclaimed");
      }
      public static void main(String[] args)
      {
      new Garbage();
      new Garbage();
      new Garbage();
      new Garbage();
      System.gc(); //請求運行垃圾收集器
      }
      }


    5.Java 內存泄漏

    由于采用了垃圾回收機制,任何不可達對象(對象不再被引用)都可以由垃圾收集線程回收。因此通常說的Java 內存泄漏其實是指無意識的、非故意的對象引用,或者無意識的對象保持。無意識的對象引用是指代碼的開發人員本來已經對對象使用完畢,卻因為編碼的錯誤而意外地保存了對該對象的引用(這個引用的存在并不是編碼人員的主觀意愿),從而使得該對象一直無法被垃圾回收器回收掉,這種本來以為可以釋放掉的卻最終未能被釋放的空間可以認為是被“泄漏了”。
    posted on 2007-10-08 09:02 wilesun 閱讀(349) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 中国一级特黄的片子免费| 午夜不卡AV免费| 最近中文字幕免费2019| 亚洲人成电影福利在线播放| 91视频免费观看| 亚洲AV无码精品无码麻豆| 免费国产在线视频| 无码专区—VA亚洲V天堂| 久久aⅴ免费观看| 亚洲香蕉免费有线视频| 亚洲一区免费在线观看| 亚洲成人福利在线观看| 成人免费视频网址| 在线亚洲v日韩v| 黑人大战亚洲人精品一区| 永久免费av无码网站yy| 亚洲黄色在线电影| 无码一区二区三区免费视频| 亚洲色大成网站www久久九| 热99re久久免费视精品频软件| 亚洲精华液一二三产区| 亚洲麻豆精品国偷自产在线91| 岛国岛国免费V片在线观看| 亚洲综合精品香蕉久久网97| 99国产精品永久免费视频| 激情无码亚洲一区二区三区| 亚洲欧洲自拍拍偷精品 美利坚| 免费av一区二区三区| 亚洲黄色激情视频| 无码欧精品亚洲日韩一区夜夜嗨| 中文字幕久无码免费久久| 亚洲天天在线日亚洲洲精| 天天干在线免费视频| 一级毛片免费不卡直观看| 亚洲国产精品自在线一区二区| 无码少妇一区二区浪潮免费 | 久久精品国产精品亚洲毛片| 国产人在线成免费视频| 一级做a爰性色毛片免费| 亚洲第一成年网站大全亚洲| 国产免费久久精品|