国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

解析Java對象引用與JVM自動內存管理

2019-11-18 10:46:30
字體:
來源:轉載
供稿:網友

  對象引用應用程序設計接口是JDKTM1.2中新定義的。該應用程序設計接口答應應用程序以對象引用的方式與JVM的內存治理器進行交互。當應用程序需治理大量內存對象或者在新的java對象創建之前需刪除原有對象時,Java對象引用應用程序設計接口具有相當大的用途,例如:
  
  ● 基于Web的應用程序經常要求顯示大量圖片,當用戶離開某一Web頁時,往往不能確定是否能夠順利的返回。在這種程序中,應用Java對象引用API可以創建這樣一個環境,即當堆內存以最小程度運行時,內存治理器創建對象。當用戶返回時,應用程序就會重新載入已經創建的圖片。
  
  ● 應用對象引用隊列可以創建這樣一個環境,當通過對象引用獲得某一對象時,應用程序得到通知。然后,應用程序就可以對相關對象進行清除操作,同時使這些對象在內存治理器中合法化。
  
  內存治理器的工作機制
  
  下面將首先介紹未嵌入引用對象時內存治理器的工作機制,然后討論引用對象加入之后Java堆發生的變化。
  
  內存治理器的作用就是識別程序中不再使用的對象,并且回收其內存。
  
  一個Java應用程序由一系列線程組成,每個線程執行一系列方法,而每個方法通過參數或局部變量來引用對象。這些引用屬于引用集合中的一部分,直接進入應用程序。另外,引用集合中還包括類庫中定義的靜態引用變量,以及通過Java本地接口(JNI)API獲得的引用。引用集合中的所有引用對象都可以被當前應用程序獲取,而不必被回收。同樣地,這些對象可能包含對其它對象的引用,也可以被應用程序獲取,依此類推。Java堆中的其它對象視為不可獲取的,而所有這些不可獲取的對象在內存治理中也是合法的。假如一個不可獲取的對象使用finalize()方法,任務就交給了對象所調用的收尾器(finalizer)。在內存回收期間,不具有收尾器的不可獲取對象和已經調用收尾器的對象被簡單回收。
  
  內存回收的算法是不斷變化的,共性的方面是從引用集合中識別可獲取的對象以及回收被其它對象占據的內存空間。
  
  加入引用對象之后的引用與常規引用的區別在于,引用對象中的引用專門由內存治理器來處理。引用對象封裝了其它一些對象的引用,我們稱之為指示對象。在引用對象創建的同時,也就定義了該引用對象的指示對象。
  
  Java對象引用
  
  圖1所示為對象引用應用程序設計接口中定義的類層次。其中SoftReference類、WeakReference類和PhantomReference類中分別定義了三種引用對象以及相應的三種獲取對象的能力。因此按照由強到弱,對象可獲取程度可劃分為如下五種類型:強獲取(strongly reachable)、次獲取(softly reachable)、弱獲取(weakly reachable)、虛獲取(phantomly reachable)和不可獲取(unreachable)。
   解析Java對象引用與JVM自動內存治理(圖一)
  圖1 對象應用類層次
  
  根據應用程序要求,對象可以是強引用(strong references)、次引用(soft references)、弱引用(weak references)、虛引用(phantom references)的任意組合。為了確定對象的可獲取程度,JVM內存治理器從引用集合出發遍尋堆中所有到對象的路徑。當到達某對象的任意路徑都不含有引用對象時,則稱該對象具有強獲取能力;當路徑中含有一個或幾個引用對象時,根據內存治理器所查詢的引用對象的類型分別歸為次獲取、弱獲取、虛獲取。
  
  另外,對象引用API中還定義了引用對象隊列(java.lang.ref.ReferenceQueue),這是內存治理器對引用對象進行治理的一種簡單數據結構。值得注重的是,在進行引用對象定義時,要求phantom reference對象必須產生于一個引用對象隊列,而soft reference和weak reference對象則無此限制,如:
  
  ReferenceQueue queue = new ReferenceQueue();
  PhantomReference PR = new PhantomReference(object, queue);
  Soft References 應用實例
  
  下面以在基于web的應用程序中使用soft references為例,來說明Java對象引用與JVM的內存治理器進行交互的原理。
  
  當用戶打開某一web頁時,applet代碼獲得圖片并且得到顯示。假如在代碼中同時創建了該圖片對象的soft references,那么當用戶離開該web頁時,內存治理器對圖片所分配的內存是否回收做出選擇。當用戶返回該web頁時,在applet代碼中使用SoftReference.get方法就會得到圖片才內存中是否仍存在的消息。假如在內存治理器中未創建該圖片,在web頁上會很快得到顯示;否則,applet代碼就會重新獲取。
  
  下面是Example.java的完整源代碼。
  
  import java.awt.Graphics;
  import java.awt.Image;
  import java.applet.Applet;
  import java.lang.ref.SoftReference;
  public class Example extends Applet {
    SoftReference sr = null;
    public void init() {
      System.out.println("Initializing");
    }
    public void paint(Graphics g) {
      Image im = (sr == null) ? null : (Image)(sr.get());
      if (im == null) {
        System.out.println("Fetching image");
        im = getImage(getCodeBase(),"yundong.gif");
        sr = new SoftReference(im);
      }
      System.out.println("Painting");
      g.drawImage(im, 25, 25, this);
      g.drawString("運動之美",20,20);
     im = null; 
    /* Clear the strong reference to the image */
    }
  
    public void start() {
      System.out.println("Starting");
    }
  
    public void stop() {
      System.out.println("Stopping");
    }
  }
  
  在上面的代碼中,對象image是一個圖片對象,傳遞給一個SoftReference對象sr。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 吴旗县| 通辽市| 遂川县| 元谋县| 景东| 水城县| 循化| 台北县| 民权县| 象山县| 华亭县| 灵山县| 灵武市| 彰武县| 浦城县| 巴彦淖尔市| 依兰县| 江西省| 平乡县| 墨江| 沅江市| 云南省| 宜章县| 鲁山县| 甘泉县| 额尔古纳市| 根河市| 和林格尔县| 渝北区| 蕲春县| 元朗区| 砀山县| 新沂市| 交城县| 通河县| 长武县| 大荔县| 房山区| 肇庆市| 景东| 明水县|