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

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

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

    本站不再更新,歡迎光臨 java開發技術網
    隨筆-230  評論-230  文章-8  trackbacks-0

    1

    JVM中的存儲空間分為堆(heap)和棧。堆呢,放程序運行過程中創建的對象,而棧呢主要放static方法與static 變量.


    堆內存中又分為兩個區。新對象區,和老對象區。新對區又分為三個小區:伊甸園區,From區,To區。伊甸園區用來存放新創建的對象。當伊甸園區放滿后,JVM系統做達到性測試,主要檢測那些由根集合出發而不可到達的,這此對象被JVM回收。并且將所有活動對象從伊甸園區拷貝到To區,此時一些對象從發生狀態變化。有此對象從To區域被拷貝到From區域,此時From區域就有對象。整個過程都是由JVM來完成的。
    老對象區域中的對象仍然有一個較長的生命周期。大多數JVM系統垃圾對象,都來源于“短命”對象,經過一段時間后被轉入老對象區域,就成了垃圾對象。

    2 JVM中對象的生命周期
    ??? 對象整個生命周期分為七個階段:創建階段,應用階段,不可視階段,不可到達分階段,可收集階段,終結階段,釋放階段。
    ?? 對象的創建要經過以下5個步驟的:
    ??? 1)為對象創建空間
    ??? 2)開始構造對象
    ??? 3)遞歸調用其超類的構造方法
    ??? 4)進行對象實例初始化和變量初始化
    ??? 5)執行構造方法體

    對象創建原則:
    ??? 1) 避免在循環體中創建對象。
    ??? 2) 盡量及時使對象符合垃圾回收標準
    ??? 3) 不要采用過深層次繼承
    ??如:
    ? for(int i=1;i<1000;i++){
    ??? Object o=new Object();
    ? }
    執行的效率遠比不上。
    ? Object o=null;
    ? for(int i=0;i<1000;i++){
    ????? o=new Object();
    ?}
    采用這種方式,僅在內存中保存一份該對象的引用。
    而不像上面的方法產生大量的對象。浪費大量內存,添加了垃圾回收的負擔。

    在程序設計中要做到“勿以惡小而為之”
    ?
    對象應用階段:
    ???? 一個應用階段的對象應具備以下特征:
    ?????? 1) 系統至少維護著對象的一個強引用
    ?????? 2) 所有對該對象的用都是強引用,除了我們顯式地使用了軟引用,弱引用和虛引用外。
    ??? 強引用:是指從JVM根集出發遍尋堆中所有到達對象的路徑,
    ??? 軟引用:當內存不足時才回收這類內存,因為當內存足夠時通常不回收,適合較長生命周期對象。
    ??? 弱引用:弱引用對象最容易被GC回收。一旦弱引用置為NULL時,這個對象引用就不存在了,GC能夠回速回收該對象的空間。如
    ?? import java.lang.ref.WeakReference;
    ?? A a=new a();
    ? //把a至為弱引??? 用
    ? WeakReference wr=new WeakReference(a);
    ? a=null;
    ? if(wr!=null){
    ???? a=wr.get();
    ? }else{
    ???? a=new A();
    ???? wr=new WeakReference(a);
    ? }

    不可視階段
    ???? 說明我們在其它區域已經不可以再引用它。如本地變量的引用,例子略。

    不可到過階段
    ??? 找不到的對象,

    可收集階段,終結階段和釋放分階段
    ??? 在這個階段的對象具有以下特征:
    ???? 1 回收器發現該對象不可到達。
    ???? 2 finally 方法已被執行
    ???? 3 對象空間已被重用

    JAVA的析構方法finalize
    類似于C++的析構函數。通常我們在程序的最后使用用super.finalize()來實現從下到上的finalize的調用。通常我們在finalize方法中釋放一些非常重要的資源如:I/O操作,數據庫連接。由于GC調用finalize的時間是不確定的,我們需要通過其它手段釋放其占用的資源如:
    public ?Class? A{
    ??? Object a=null;
    ????public A(){
    ????? System.out.println("創建對象A");
    ????? a=new Object();
    ??? }
    ?? proctected void destroy(){
    ???? a=null;
    ???? System.out.println("釋放a對象");
    ?? }

    ?proctected void finalize() throws? java.lang.Throwable{
    ???? destroy();
    ????? super.finalize(); //遞歸調用超類的finalize()
    ?}
    }

    JAVA程序設計中有關內存的管理經驗:
    ? 1?不再使用的變量要盡早將不用的對象賦為NULL,這將加速GC的工作。

    ?2?? 盡量少用finalize函數,因為它會加GC的工作量。

    ?3? 如果經常用到圖片,可以使有soft引用類型。這樣能防止memory outof

    4??注意使用集合數據類型,因為數組,樹,圖。對GC來說回收更復雜,注意一些static 和全局變量,因為往往容易引起懸掛對象和內存浪費。

    5 盡量避免在類的權造器中創建初始化大量對象。

    6 避免強制系統做垃圾回收(顯式調用方法System.gc())

    7?盡量避免顯式申請數組空間。

    8 盡量用對象池。



    ??

    posted on 2006-04-11 10:55 有貓相伴的日子 閱讀(255) 評論(0)  編輯  收藏 所屬分類: j2ee
    本站不再更新,歡迎光臨 java開發技術網
    主站蜘蛛池模板: 亚洲欧美日韩中文高清www777 | 3d动漫精品啪啪一区二区免费| 久久亚洲精品专区蓝色区| 免费人妻无码不卡中文字幕18禁| 日韩精品久久久久久免费| 免费播放美女一级毛片| 亚洲一级黄色大片| 亚洲爆乳精品无码一区二区三区 | 国产精品亚洲精品观看不卡| 亚洲国产精品成人精品无码区在线| 日韩免费在线观看| 免费观看AV片在线播放| 国产精品免费无遮挡无码永久视频| 免费一区二区无码视频在线播放| 亚洲国产成人手机在线观看| 亚洲日本va在线观看| 久久精品国产亚洲av高清漫画| 亚洲精品成人网站在线观看 | 国产VA免费精品高清在线| 亚洲av无码专区在线电影天堂| jlzzjlzz亚洲jzjzjz| 久久久久久久亚洲Av无码| 亚洲无码在线播放| 久久亚洲色一区二区三区| 国产国产成年年人免费看片| 好吊妞788免费视频播放| 成人女人A级毛片免费软件 | 性xxxx黑人与亚洲| 亚洲av成人一区二区三区| 亚洲国产日韩在线成人蜜芽 | 在线观看免费视频网站色| 一级特黄特色的免费大片视频| 另类专区另类专区亚洲| MM1313亚洲精品无码久久| 亚洲丁香婷婷综合久久| 亚洲AV色欲色欲WWW| 亚洲AV成人无码网天堂| 国产91成人精品亚洲精品| 特色特黄a毛片高清免费观看| 欧洲美女大片免费播放器视频| 日韩一区二区三区免费播放|