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

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

改進對象管理方式 提高程序性能

2019-11-18 12:12:35
字體:
來源:轉載
供稿:網友

  一、java的內存治理
  對象是功能強大的軟件構造模塊,在 Java中它們有著極其廣泛的應用。實際上,由于對象的應用是如此廣泛,開發者有時忘記了創建對象所要付出的代價,結果就導致程序進入了“對象攪拌器”(Object Churn)狀態。在這種狀態下,處理器的大部分時間消耗在周而復始的創建對象和回收被廢棄對象的操作中。
  對于熟悉C/C++的開發者來說,內存治理方面的簡化是Java重要的特點。與C/C++要求程序顯式地分配和釋放內存相反,Java答應開發者根據需要為對象分配空間,并確保當程序不再需要對象時,對象占用的空間會被JVM回收。這些工作都在后臺的垃圾回收進程中進行。
  在編程語言中,用垃圾收集機制來治理內存可以回溯到計算機剛剛誕生的二十世紀六十年代。無論具體情形如何,垃圾收集的基本原理都是一樣的:先標識出那些程序不再使用的對象,然后回收這些對象占用的內存。
  一般地,JVM利用一種“可到達性”(Reachability)算法標識正在使用的對象,然后回收所有其余的對象。這個過程從一組程序直接使用的變量開始,包括每一個活動線程的局部變量、方法調用堆棧上的參數變量以及已裝入類的靜態變量所引用的對象。所有上述幾類變量所引用的對象都被加入到“可到達”對象集合。接著,這些對象的成員變量所引用的每一個對象也被加入到可到達對象集合。這個過程重復進行直至結束;結束時,可到達對象集合中的任意對象所引用的每一個對象都已經在可到達集合中。所有不在可到達對象集合中的對象都被認為已經廢棄不用,也就是可以安全地回收。
  通常,Java的垃圾收集過程無需開發者干預。JVM周期性地運行垃圾收集過程,或者是當程序的線程因為等待外部事件,所以答應垃圾收集過程運行;或者是當程序創建新對象時內存不足,因而必須運行垃圾收集過程。盡管垃圾收集是自動進行的,但了解這一過程是很重要的,因為垃圾收集將占用很大一部分Java程序的開銷。
  除了垃圾收集的時間開銷之外,Java中的對象還會產生大量的空間開銷。對于每一個已分配的對象,JVM將加上必要的內部信息以便垃圾收集過程順利進行。另外,JVM還要加入一些Java語言規范所要求的信息,這些信息對于某些功能來說是必不可少的,比如在任意對象上同步的功能。假如把JVM內部為每一個對象分配的空間計入對象的占用空間,則小型Java對象要比C/C++中等價的對象大得多。下面的表格顯示了幾種不同JVM下一些簡單對象的內存占用情況,其中“內容”列顯示用戶可訪問內容的大小,其余各列顯示不同JVM下對象實際占用的內存大小,從該表可以看出JVM額外增加的內存開銷。
  改進對象治理方式 提高程序性能
  上面的空間開銷是單個對象的值,因此,對于大對象來說空間開銷的百分比將下降。假如程序使用了大量的小型對象,可能使性能變得很糟糕。
  
  二、盡量使用基本數據類型
  
  在Java程序中,減少對象創建操作最簡單的策略或許就是盡可能地使用基本數據類型。然而,這個策略可適用的場合并不是很多,許多時候對象有充足的理由成為首選的數據格式,簡單地用基本數據類型來替換對象不能滿足設計要求。但是,在確實適用該策略的場合,它可以減少大量的開銷。
  Java的基本數據類型包括boolean、byte、char、double、float、int、long和short。使用基本數據類型的變量不會產生創建對象的開銷,用完之后也不需要進行垃圾收集。對于局部方法變量,JVM將直接在堆棧分配變量空間;對于成員變量,JVM在對象使用的空間為變量分配空間。
  Java為每一種基本數據類型定義了相應的封裝類。封裝類代表的是和基本數據類型值對應但不可變的值,使得基本數據類型的值可以作為對象處理;使用java.util.Vector、java.util.Stack、java.util.Hashtable等工具類時,這種對象非常有用。但除了這些非凡情況之外,應當避免使用封裝類,盡量使用基本數據類型,避免創建對象所需要的內存和時間開銷。
  
  除了標準的封裝類值外,Java類庫中還有一些類是在基本類型的基礎上加上一層新的語義和行為,java.util.Date和java.awt.Point都屬于這類例子。在大量應用這類值的場合,存儲和傳遞對應的基本類型值(只在必要的時候才把它們轉換成相應的對象)能夠減少不必要的對象創建操作。例如,對于Point類,我們可以直接訪問Point內部的int值,或者把它們組合成一個long值使得方法調用只需返回一個基本類型的值。下面是一個計算中點的例子:
  ...
  // 用long值表示Point的例子。
   // 每一個long值的高位包含x坐標,
   // 低位包含y坐標
   public long midpoint(long a, long b) {
     // 計算每一個坐標上的中值
     int x = (int) (((a >> 32) + (b >> 32)) / 2);
     int y = ((int) a + (int) b) / 2;
     // 返回中點
   return (x << 32) + y;
   }
   ... 
  三、專用對象重用
  減少對象創建操作的另一途徑是重用對象。被重用的對象可能是專門用于某一特定用途,也可能在不同的時刻用于不同的目的,因此,重用對象主要包括兩種變化形式:專用對象重用,具有簡單方便的特點;自由緩沖池重用,具有最好的對象重用效果。
  最簡單的對象重用情況是,一個頻繁執行的任務需要一個或者多個起輔助作用的對象。許多應用經常進行日期格式化操作,下面我們就以此為例討論專用對象重用。要從一個指定的日期值(按照前面盡量使用基本數據類型的要求,這個值是long類型)生成默認的字符串表示形式,我們可以:
   ...
  // 生成時間的默認字符串表示形式
  long time = ...;
  String display = DateFormat.getDateInstance().format(new Date(time));
  ... 
  這個語句看起來很簡單,實際上卻進行了大量復雜的對象創建操作。DateFormat.getDateInstance()調用創建了一個新的SimpleDateFormat實例,后者又要創建一系列相關的對象;然后,format調用又要創建新的StringBuffer和FieldPosition對象。在JRE 1.2.2和Windows 98下,這個簡單的語句實際分配的內存多達2400字節。假如這個語句需要頻繁地執行,臨時生成和丟棄的對象數量是相當可觀的。
  3.1 私有的對象
  改進的方法是預先(一次性地)創建進行格式化所需要的對象,這組對象由使用它們的代碼所擁有(專用),然后在需要時重用這些對象。例如,假如我們通過實例變量實現該方案,使得容器類的每一個實例擁有這些對象的唯一一份拷貝,修改后的代碼如下:...
  // 以成員變量的形式分配專用的日期格式化對象
   PRivate final Date convertDate = new Date();
   private final DateFormat convertFormat = DateFormat.getDateInstance();
   private final StringBuffer convertBuffer = new StringBuffer();
   private final FieldPosition convertField = new FieldPosition(0);
   ...
   // 生成指定日期的默認字符串表示形式
     long time = ...;
  convertDate.setTime(time);
   convertBuffer.setLength(0);
     StringBuffer output =
       dateFormatter.format(convertDate, convertBuffer, convertField);
     String display = output.toString();
     ... 
  這個代碼片斷顯然要比原先的代碼長,但在每次執行時只需創建一個輸出的字符串對象,因而速度要快得多。簡單的測試表明,改進后的代碼100000次迭代只需8秒,而原來代碼的相應時間則為50秒。由于用來格式化的對象并未在一次使用后馬上釋放,所以改進后的代碼占用了更多的內存(或占用時間更長),但假如代碼執行非常頻繁,這個代價仍是非常合算的。
  值得指出的是,假如在一個執行大量迭代的方法之內有一個內部循環,上面討論的技術同樣有用。我們不一定要把循環內用到的對象轉移到包含該方法的類之內,而是可以把這些對象的創建操作移到循環之外,使得創建操作只執行一次。按照這種思想,代碼可以為:
   // 分配循環內要用到的對象
   Date date = new Date();
     DateFormat formatter = DateFormat.getDateInstance();
     StringBuffer buffer= new StringBuffer();
     FieldPosition field = new FieldPosition(0);
     // 執行循環
     for (...) {
       // 生成指定時間的字符串表示形式
       long time = ...;
       date.setTime(time);
       buffer.setLength(0);
       StringBuffer output = formatter.format(date, buffer, field);
       String display = output.toString();
     } 
  結合前面介紹的用基本類型值替代相應對象類型值技術,這種專用對象重用技術的效果更好。專用對象可以從基本類型值實例化然后傳遞給Java標準類庫中要求對象作為參數類型的方法。上面的專用Date對象就是一個很好的例子。
  3.2 多個線程公用的私有對象
  假設我們有一組私有的對象,有多個線程并發地執行使用這些對象的代碼,因此必須避免不同的線程操作這些對象可能引起的沖突。實現這個目標最簡單的方法是指定其中一個對象作為整組對象的鎖,把使用這些對象的代碼封裝在一個在鎖對象上同步的塊中。盡管每次使用私有對象時都會增加加鎖操作的開銷,但和創建對象的時間相比,加鎖操作的開銷較小。
  假定以convertDate對象作為鎖,則使用這些對象的代碼應該改為:     // 獲得私有對象的使用

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本中文字幕不卡免费| 亚洲free性xxxx护士hd| 日韩中文字幕国产精品| 欧美老少配视频| 5252色成人免费视频| 日韩视频永久免费观看| 97国产成人精品视频| 亚洲精品国产美女| 国产精品私拍pans大尺度在线| 欧美二区乱c黑人| 日韩高清av一区二区三区| 久久天天躁狠狠躁夜夜爽蜜月| 久久精品国产欧美亚洲人人爽| 久久精品亚洲热| 国产大片精品免费永久看nba| 538国产精品一区二区免费视频| 久久精品成人欧美大片| 亚洲成人精品久久| 激情成人在线视频| 国产欧美在线视频| 福利一区视频在线观看| 欧美老肥婆性猛交视频| 国产精品狼人色视频一区| 国产精品亚洲精品| 久久久久久亚洲精品不卡| 欧美大尺度激情区在线播放| 亚洲一区二区久久久| 日韩免费av一区二区| 欧日韩不卡在线视频| 成人精品一区二区三区电影黑人| 亚洲精品久久久久中文字幕二区| 68精品久久久久久欧美| 在线成人免费网站| 亚洲成人精品久久久| 亚洲欧洲国产精品| 精品久久久久久久久久久久久| 欧美日韩中文字幕| 国产一级揄自揄精品视频| 欧美日韩在线观看视频小说| 中文字幕欧美日韩精品| 久久九九免费视频| 不卡av在线播放| 国产欧美va欧美va香蕉在| 国产精品wwww| 国产精品丝袜一区二区三区| 亚洲欧美日韩国产成人| 亚洲精品狠狠操| 亚洲精品色婷婷福利天堂| 久久久久久欧美| 中文字幕av日韩| 国产精品日韩精品| 国产日韩欧美电影在线观看| 国产一区二区三区视频| 亚洲国产古装精品网站| 久久久久女教师免费一区| 97视频在线观看亚洲| 色无极亚洲影院| 中文字幕一精品亚洲无线一区| 精品呦交小u女在线| 亚洲色图欧美制服丝袜另类第一页| 欧美成年人视频网站| 久久好看免费视频| 精品久久中文字幕| 一本色道久久综合狠狠躁篇的优点| 国产精品狼人色视频一区| 97视频网站入口| 亚洲日韩中文字幕| 久久久久久九九九| 欧美激情免费观看| 国产精品嫩草影院一区二区| 欧美激情第99页| 久久久久久尹人网香蕉| 97在线视频免费观看| 亚洲性线免费观看视频成熟| 久久久综合av| 欧美一区视频在线| 日av在线播放中文不卡| 亚洲欧洲在线观看| 亚洲高清一二三区| 欧美俄罗斯性视频| 国产91精品久久久久久| 久久免费国产视频| 国产精品国产三级国产aⅴ浪潮| 国产主播喷水一区二区| 欧美国产日韩中文字幕在线| 91久久精品一区| 亚洲大尺度美女在线| 成人看片人aa| 国产成人综合亚洲| 亚洲自拍偷拍色图| 亚洲人成网站色ww在线| 亚洲综合自拍一区| 美女999久久久精品视频| 美日韩精品免费视频| 国产美女久久久| 成人免费xxxxx在线观看| 午夜美女久久久久爽久久| 国产日产亚洲精品| 国产一区二区三区在线观看视频| 久久久久久综合网天天| 久久久亚洲欧洲日产国码aⅴ| 日韩中文字幕视频在线| 国产精品精品久久久| 成人午夜在线观看| 久久五月情影视| 黑人巨大精品欧美一区二区一视频| 久久综合五月天| 亚洲国产中文字幕在线观看| 川上优av一区二区线观看| 欧美视频在线看| 91精品国产免费久久久久久| 欧美日韩高清在线观看| 亚洲色图av在线| 亚洲网站在线播放| 日韩一区二区福利| 九九久久精品一区| 亚洲区免费影片| 亚洲激情国产精品| 国产成人精品免费视频| www高清在线视频日韩欧美| 色综合伊人色综合网| 精品中文字幕在线| 在线看国产精品| 久久精品成人欧美大片古装| 一区二区欧美久久| 国产午夜精品视频免费不卡69堂| 亚洲一区二区精品| 日韩电影中文字幕一区| 国产91色在线免费| 久久久久久久999| 成人xvideos免费视频| 在线精品高清中文字幕| 色偷偷亚洲男人天堂| 日韩欧美国产激情| 91午夜理伦私人影院| 欧美性xxxxhd| 亚洲а∨天堂久久精品喷水| 国产视频精品va久久久久久| 国产精品视频不卡| 日韩成人在线播放| 欧美性极品xxxx娇小| 91精品国产电影| 91超碰caoporn97人人| 久久精品国产亚洲精品| 国产精品久久久91| 日韩欧美在线视频日韩欧美在线视频| 国色天香2019中文字幕在线观看| 欧美亚州一区二区三区| 日韩精品福利在线| 日韩精品在线第一页| 日韩免费不卡av| 自拍偷拍亚洲精品| 欧美黑人xxxⅹ高潮交| 亚洲精品一区在线观看香蕉| 午夜精品福利电影| 日韩最新av在线| 亚洲欧洲日产国码av系列天堂| 欧美日韩国产二区| 国产成人在线亚洲欧美| 欧美精品在线免费| 丝袜情趣国产精品| 欧美日韩一区二区精品| 国产精品999999| 高跟丝袜一区二区三区|