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

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

講述J2EE系統優化的幾點體會

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

  說到系統優化,是一個比較復雜的問題,涉及到軟件的各個方面:需求、模塊劃分、數據庫設計、程序編碼以及一些非凡的優化方法如緩存技術等。而不同的應用又有其非凡的優化策略和技術。同時優化是貫穿系統從需求到實現再到維護的各個階段的一項活動,而在各個階段又有其不同的著眼點和具體方法。
  
  本文立足于具體的J2EE項目實踐,結合一些已有的優化條例,提出自己的一些體會,也算是作為一次對實際項目經驗教訓的總結。
  
  優化一般意義上說是提高已有系統的性能,減少如內存、數據庫、網絡帶寬等資源的占用,是在系統開發告一段落的前提下進行。一般是通過壓力測試或具體使用發現性能方面的問題,然后尋找性能瓶頸,并結合項目進度、人員安排、技術儲備等因素,提出相應的優化策略。
  
  下面結合一些案例,進行具體的討論,并希望能總結出一些具有代表性的條例:
  
  條例一:盡量重用對象,避免創建過多短時對象
  
  對象在面向對象編程中隨處可見,甚至可以毫不夸張的說是:“一切都是對象”。如何更好的創建和使用對象,是優化中要考慮的一個重要方面。筆者將對象按使用分為兩大類:獨享對象和共享對象。獨享對象指由某個線程單獨擁有并維護其生命周期的對象,一般是通過new 創建的對象,線程結束且無其它對這個對象的引用,這個對象將由垃圾收集機制自動GC。共享對象指由多個線程共享的對象,各線程保持多個指向同一個對象的引用,任何對這個對象的修改都會在其它引用上得到體現,共享對象一般通過Factory工廠的getInstace()方法創建,單例模式就是創建共享對象的標準實現。獨享對象由于無其它指向同一對象的引用,不用擔心其它引用對對象屬性的修改,在多線程環境里,也就不需要對其可能修改屬性的方法加以同步,減少了出錯的隱患和復雜性,但由于需要為每個線程都創建對象,增加了對內存的需求和JVM GC的負擔。共享對象則需要進行適當的同步(避免較大的同步塊,同時防止死鎖)。
  
  還有幾種非凡對象:不變對象和方法對象。不變對象指對象對外不含有修改對象屬性的方法(如set方法),外部要修改屬性只能通過new新的實例來實現。不變對象最大的好處就是無需擔心屬性被修改,避免了潛在的bug,并能無需任何額外工作(如同步)就很好的工作在多線程環境下。如jdk的String對象就是典型的不變對象。方法對象簡單的說就是僅包含方法,不含有屬性的對象。由于沒有對象屬性,方法中無需進行修改屬性的操作,也就能采用static方法或單例模式,避免每次使用都要new對象,減少對象的使用。
  
  那么該如何確定創建何種對象,這就要結合對象的使用方式和生命周期、對象大小、構建花銷等方面來綜合考慮。假如對象生命周期較長,會存在修改操作,不能容忍其它線程對其的修改,就應該采用獨享對象,如常見的Bean類。而假如對象生命周期較長,且能為各個線程共享,就可以考慮共享對象。共享有2種常見情況,一種是系統全局對象,如配置屬性等,各個線程應該引用同一對象,任何對這個對象的修改都會影響其它線程;另一種是由于對象創建開銷較大,各線程對此對象是瞬時訪問,且無需再次讀取其屬性,如常見的Date 對象,一般這種對象的使用是瞬時的,比如把它format成String,假如每次創建然后等待GC就會浪費大量內存和CPU時間,較好做法就是做成共享對象,各個線程先set再使用,注重對進行set并訪問的方法要同步。不變對象一般使用在對象創建開銷較?。▽傩暂^少,類層次較少),且需要能自由共享的情形。如一個對象里的常量對象,使用public static final AAA=new AAA(…) 創建。方法對象使用較廣,如Util類、DAO類等,這些對象提供操作其它對象(一般是bean對象)的接口,能對系統在層次和功能上進行解耦合。
  
  條例二:在循環處,多下功夫
  
  循環作為程序編寫的基本語法,可以說是隨處可見。一些小的細節能帶來性能上的提升,而對循環體的一些改寫,能帶來性能的大幅提升。
  
  比如最簡單的List遍歷,會有這樣的寫法:for(int i=0;i
  
  同樣是對List的操作,假如要在遍歷同時進行增加和刪除操作,代碼如下:for(int i=0,j=l.size();i=0;i--){l.remove(i);}。經過測試,假如采用ArrayList,兩種寫法在循環次數較少時沒有太大的區別,循環次數為1000,均為1ms以內,次數為10000,前一種為60ms左右,后一種為1ms以內,,而次數上到100000,前一種為6000ms左右,后一種為15ms,隨著循環次數的增多,后一種較前一種的效率優勢明顯提高。
  
  這是由Collection庫ArrayList的實現決定的,以下是jdk1.3的ArrayList源碼
  
  public Object remove(int index) {
  RangeCheck(index);
  modCount++;
  Object oldValue = elementData[index];
  int numMoved = size - index - 1;
  if (numMoved > 0)
  System.arraycopy(elementData, index+1, elementData, index,
  numMoved);
  elementData[--size] = null; // Let gc do its work
  return oldValue;
  }
  
  從中我們可以看出,numMoved代表了需要進行arraycopy操作的數量,它是由remove的位置決定的,假如index=0,也就是刪除第一個元素,則需要arraycopy后面的所有數據,
  
  而假如index=size-1,則只需將最后一個元素設為null即可。所以從后面向前循環remove是比較好的寫法。
  
  假如List中的確存在較多的add或remove操作,且容量較大(如存儲幾萬個對象),則應該采用LinkedList作為實現。LinkedList內部采用雙向鏈表作為數據結構,比ArrayList占用較多內存空間,且隨機訪問操作較慢(需要從頭或尾循環到相應位置),但插入刪除操作很快(僅需進行鏈表操作,無須大量移動或拷貝)。
  
  對于List操作假如循環規模較小,其實對性能影響非常?。╩s級),遠遠不是性能瓶頸所在。但心中有著優化的意識,并力求寫出簡潔高效的程序應該是我們每個程序員的追求。而且一旦在循環規模較大時,假如有了這些意識,也就能有效的消除性能隱患。
  
  再舉一個與優化無關但確實可能成為性能殺手(可以說是bug)的循環的例子。下面是源代碼:
  
  for(; totalRead < m_totalBytes; totalRead += readBytes)
  {
  readBytes = m_request.getInputStream().read(m_binArray, totalRead, m_totalBytes - totalRead);
  }
  
  這個代碼意圖很清楚,就是將一個InputStream流讀到一個byte數組中去。它使用read方法循環讀取InputStream,該方法返回讀取的字節數。正常情況下,該循環運行良好,當totalRead=m_totalBytes時,結束循環,byte數組被正常填充。但假如仔細看一下InputStream的read方法的說明,了解一下其返回值就會發現,返回值可能為-1,即已讀到InputStream末尾再繼續讀時。假如發生讀取異常,可能出現這個問題,而這個循環沒有檢查readBytes值是否為-1就往totalRead上加,這樣再次進入循環體繼續讀取InputStream,又返回-1,繼續循環。如此循環直到int溢出才會跳出循環。而這個循環也就成了實實在在的CPU殺手,可以占去大量的CPU時間(取決于操作系統)。其實解決很簡單,對readBytes進行判定,假如為-1則跳出循環。
  
  這個例子告訴我們:對循環一定要搞清循環的循環規模、每次循環體執行時間、循環結束條件包括異常情況等,只有這樣才能寫出高效且沒有隱患的代碼。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品视频在线观看免费| 国产ts一区二区| 午夜精品免费视频| 国产精品久久久久久久app| 国产日本欧美一区二区三区| 国产suv精品一区二区三区88区| 亚洲一区二区三区视频| 亚洲精品色婷婷福利天堂| 久久久国产精品亚洲一区| 亚洲国产精彩中文乱码av| 久久人人爽国产| 亚洲第一区中文字幕| 91久久久久久国产精品| 9.1国产丝袜在线观看| 亚洲国产第一页| 国产mv久久久| 日韩小视频在线观看| 午夜精品久久久久久久男人的天堂| 色综合导航网站| 亚洲国产91精品在线观看| 91经典在线视频| 国产精品www| 91情侣偷在线精品国产| 国产成人亚洲综合青青| 日韩在线视频一区| 亚洲人成在线观看网站高清| 久久资源免费视频| 国产精品成人免费视频| 国产精品入口免费视| 韩国精品美女www爽爽爽视频| 亚洲国产成人在线播放| 日韩精品欧美激情| 国产精品女人久久久久久| 久久激情视频免费观看| 色妞在线综合亚洲欧美| 欧美一区视频在线| 国产精品偷伦免费视频观看的| 精品久久久久久久久久国产| 国产欧美一区二区三区视频| 国产成人精品网站| 69**夜色精品国产69乱| 操人视频在线观看欧美| 日韩一区二区久久久| 亚洲欧美另类中文字幕| 欧美猛少妇色xxxxx| 亚洲精品ady| 日韩一级黄色av| 亚洲精品成人久久| 国产精品成人av性教育| 精品国产一区二区三区久久狼5月| 久久久久久国产三级电影| 成人网在线免费看| 日韩高清av一区二区三区| 欧美一级高清免费| 国产亚洲免费的视频看| 久久中文字幕一区| 欧美日韩另类在线| 中文字幕亚洲无线码a| 国产精品九九九| 国产一区二区三区欧美| 国产精品黄页免费高清在线观看| 精品久久久国产精品999| 久久69精品久久久久久久电影好| 色婷婷av一区二区三区在线观看| 国产一区二区香蕉| 久久夜精品香蕉| 久久久精品免费视频| 国产精品偷伦免费视频观看的| 国产成人涩涩涩视频在线观看| 国产精品久久久久久亚洲调教| 国产精品视频网站| 精品美女永久免费视频| 91精品91久久久久久| 一区二区三区回区在观看免费视频| 色综合五月天导航| 人人做人人澡人人爽欧美| 国产精品激情自拍| 日韩亚洲欧美成人| 欧美乱大交xxxxx另类电影| 高清一区二区三区四区五区| 国产在线观看一区二区三区| 成人有码视频在线播放| 中文字幕在线精品| 成人网在线观看| 高清欧美性猛交xxxx| 欧美激情一区二区三区高清视频| 91久久久久久久久| 美女久久久久久久| 欧美激情视频免费观看| 91久久综合亚洲鲁鲁五月天| 国产亚洲一区二区精品| 久久人人97超碰精品888| 激情久久av一区av二区av三区| 欧美成人高清视频| 国模吧一区二区三区| 久久精品中文字幕一区| 黑人巨大精品欧美一区免费视频| 久久久久亚洲精品成人网小说| 伦伦影院午夜日韩欧美限制| 国产www精品| 国产一区二区三区免费视频| 美女999久久久精品视频| 成人国产精品一区| 国产欧美久久一区二区| 日本成人黄色片| 日韩精品视频免费在线观看| 色综合色综合网色综合| 亚洲一区美女视频在线观看免费| 91日韩在线播放| 国产精品精品久久久久久| 91精品国产91久久久| 久久香蕉国产线看观看av| 亚洲a级在线观看| 91成人在线视频| 久久99精品久久久久久噜噜| 亚洲成人黄色网址| 午夜免费日韩视频| 亚洲国产成人91精品| 成人动漫网站在线观看| 国产情人节一区| 国产精品黄视频| 91国偷自产一区二区三区的观看方式| 久久91精品国产91久久久| 欧美性猛交xxxx乱大交极品| 国产一区二区三区在线看| 欧美在线视频在线播放完整版免费观看| 免费91麻豆精品国产自产在线观看| 欧美剧在线观看| 久久天天躁夜夜躁狠狠躁2022| 国产日韩在线看| 69**夜色精品国产69乱| 欧美日韩美女在线| 久久精品国产96久久久香蕉| 97超碰蝌蚪网人人做人人爽| 久久av资源网站| 中文字幕亚洲激情| 久久久亚洲福利精品午夜| 亚洲精品一区av在线播放| 亚洲xxxx在线| 亚洲天天在线日亚洲洲精| 日韩av一区二区在线观看| 国产日韩欧美在线观看| 欧美亚洲第一区| 亚洲第一网站免费视频| 国产精品2018| 亚洲成人黄色在线观看| 亚洲精品女av网站| 国产亚洲精品久久久久久| 亚洲天堂网站在线观看视频| 97av在线视频免费播放| 亚洲区免费影片| 亚洲日本欧美日韩高观看| 91精品久久久久久久久久久久久| 亚洲精品一区二区久| 91精品国产99| 92裸体在线视频网站| 欧美裸体xxxx极品少妇软件| 久久久日本电影| 久久亚洲精品国产亚洲老地址| 亚洲一区二区中文| 日韩欧美在线国产| 日韩电影视频免费| 亚洲精品国偷自产在线99热| 久久香蕉国产线看观看网|