提升java編程性能優化知識 程式設計師必看這幾點

2021-01-14 網易

  學無止境,學海無涯。每個人在學習的路上都有自己的方法。對於學習java的學子也是如此,那麼java程式設計師如何提高編程性能呢,有哪些小知識或者技巧呢,怎麼樣才能在編程性能優化方面有所提升呢?

  1.儘量在合適的場合使用單例

  使用單例可以減輕加載的負擔,縮短加載的時間,提高加載的效率,但並不是所有地方都適用於單例,簡單來說,單例主要適用於以下三個方面:

  

  提升java編程性能優化知識 程式設計師必看這幾點

  控制資源的使用,通過線程同步來控制資源的並發訪問;

  控制實例的產生,以達到節約資源的目的;

  控制數據共享,在不建立直接關聯的條件下,讓多個不相關的進程或線程之間實現通信。

  2.儘量避免過多過常的創建Java對象

  儘量避免在經常調用的方法,循環中new對象,由於系統不僅要花費時間來創建對象,而且還要花時間對這些對象進行垃圾回收和處理,在我們可以控制的範圍內,最大限度的重用對象,最好能用基本的數據類型或數組來替代對象。

  3.儘量避免隨意使用靜態變量

  要知道,當某個對象被定義為static變量所引用,那麼GC通常是不會回收這個對象所佔有的內存,如:

  此時靜態變量b的生命周期與A類同步,如果A類不會卸載,那麼b對象會常駐內存,直到程序終止。

  4.儘量使用final修飾符

  帶有final修飾符的類是不可派生的。在JAVA核心API中,有許多應用final的例子,例如java.lang.String,為String類指定final防止了使用者覆蓋length方法。另外,如果一個類是final的,則該類所有方法都是final的。java編譯器會尋找機會內聯(inline)所有的final方法(這和具體的編譯器實現有關)。此舉能夠使性能平均提高50%。

  如:讓訪問實例內變量的getter/setter方法變成」final:

  簡單的getter/setter方法應該被置成final,這會告訴編譯器,這個方法不會被重載,所以,可以變成」inlined」,例子:

  

  5.儘量使用局部變量

  調用方法時傳遞的參數以及在調用中創建的臨時變量都保存在棧(Stack)中,速度較快。其他變量,如靜態變量,實例變量等,都在堆(Heap)中創建,速度較慢。

  6.慎用synchronized,儘量減小synchronize的方法

  都知道,實現同步是要很大的系統開銷作為代價的,甚至可能造成死鎖,所以儘量避免無謂的同步控制。synchronize方法被調用時,直接會把當前對象鎖 了,在方法執行完之前其他線程無法調用當前對象的其他方法。所以synchronize的方法儘量小,並且應儘量使用方法同步代替代碼塊同步。

  7.儘量不要使用finalize方法

  實際上,將資源清理放在finalize方法中完成是非常不好的選擇,由於GC的工作量很大,尤其是回收Young代內存時,大都會引起應用程式暫停,所以再選擇使用finalize方法進行資源清理,會導致GC負擔更大,程序運行效率更差。

  8.儘量處理好包裝類型和基本類型兩者的使用場所

  雖然包裝類型和基本類型在使用過程中是可以相互轉換,但它們兩者所產生的內存區域是完全不同的,基本類型數據產生和處理都在棧中處理,包裝類型是對象,是在堆中產生實例。在集合類對象,有對象方面需要的處理適用包裝類型,其他的處理提倡使用基本類型。

  9.儘量使用基本數據類型代替對象

  String str = 「hello」;上面這種方式會創建一個「hello」字符串,而且JVM的字符緩存池還會緩存這個字符串;String str = new String(「hello」);此時程序除創建字符串外,str所引用的String對象底層還包含一個char數組,這個char數組依次存放了h,e,l,l,o

  10.儘量合理的創建HashMap

  當你要創建一個比較大的hashMap時,充分利用這個構造函數

  避免HashMap多次進行了hash重構,擴容是一件很耗費性能的事,在默認中initialCapacity只有16,而loadFactor是 0.75,需要多大的容量(http://www.cnitedu.cn),你最好能準確的估計你所需要的最佳大小,同樣的Hashtable,Vectors也是一樣的道理。

  11.儘量減少對變量的重複計算

  如:應該改為

  並且在循環中應該避免使用複雜的表達式,在循環中,循環條件會被反覆計算,如果不使用複雜表達式,而使循環條件值不變的話,程序將會運行的更快。

  12.多線程在未發生線程安全前提下應儘量使用HashMap、ArrayList

  HashTable、Vector等使用了同步機制,降低了性能。

  13.儘量在finally塊中釋放資源

  程序中使用到的資源應當被釋放,以避免資源洩漏。這最好在finally塊中去做。不管程序執行的結果如何,finally塊總是會執行的,以確保資源的正確關閉。

  14.儘量使用移位來代替』a/b』的操作

  「/」是一個代價很高的操作,使用移位的操作將會更快和更有效

  15.儘量確定StringBuffer的容量

  StringBuffer 的構造器會創建一個默認大小(通常是16)的字符數組。在使用中,如果超出這個大小,就會重新分配內存,創建一個更大的數組,並將原先的數組複製過來,再 丟棄舊的數組。在大多數情況下,你可以在創建 StringBuffer的時候指定大小,這樣就避免了在容量不夠的時候自動增長,以提高性能。

  16.儘量早釋放無用對象的引用

  大部分時,方法局部引用變量所引用的對象 會隨著方法結束而變成垃圾,因此,大部分時候程序無需將局部,引用變量顯式設為null。例如:

  

  上面這個就沒必要了,隨著方法test的執行完成,程序中obj引用變量的作用域就結束了。但是如果是改成下面:

  

  這時候就有必要將obj賦值為null,可以儘早的釋放對Object對象的引用。

  17.儘量避免使用二維數組

  二維數據佔用的內存空間比一維數組多得多,大概10倍以上。

  18.儘量避免使用split

  除非是必須的,否則應該避免使用split,split由於支持正則表達式,所以效率比較低,如果是頻繁的幾十,幾百萬的調用將會耗費大量資源,如果確實需要頻繁的調用split,可以考慮使用apache的StringUtils.split(string,char),頻繁split的可以緩存結果。

  19.ArrayList & LinkedList

  一個是線性表,一個是鍊表,一句話,隨機查詢儘量使用ArrayList,ArrayList優於LinkedList,LinkedList還要移動指針,添加刪除的操作LinkedList優於ArrayList,ArrayList還要移動數據,不過這是理論性分析,事實未必如此,重要的是理解好2者得數據結構,對症下藥。

  20.儘量使用System.arraycopy 代替通過來循環複製數組

  System.arraycopy 要比通過循環來複製數組快的多

  21.儘量緩存經常使用的對象

  儘可能將經常使用的對象進行緩存,可以使用數組,或HashMap的容器來進行緩存,但這種方式可能導致系統佔用過多的緩存,性能下降,推薦可以使用一些第三方的開源工具,如EhCache,Oscache進行緩存,他們基本都實現了FIFO/FLU等緩存算法。

  22.儘量避免非常大的內存分配

  有時候問題不是由當時的堆狀態造成的,而是因為分配失敗造成的。分配的內存塊都必須是連續的,而隨著堆越來越滿,找到較大的連續塊越來越困難。

  23.慎用異常

  當創建一個異常時,需要收集一個棧跟蹤(stack track),這個棧跟蹤用於描述異常是在何處創建的。構建這些棧跟蹤時需要為運行時棧做一份快照,正是這一部分開銷很大。當需要創建一個 Exception 時,JVM 不得不說:先別動,我想就您現在的樣子存一份快照,所以暫時停止入棧和出棧操作。棧跟蹤不只包含運行時棧中的一兩個元素,而是包含這個棧中的每一個元素。

  如果您創建一個 Exception ,就得付出代價。好在捕獲異常開銷不大,因此可以使用 try-catch 將核心內容包起來。從技術上講,您甚至可以隨意地拋出異常,而不用花費很大的代價。招致性能損失的並不是 throw 操作——儘管在沒有預先創建異常的情況下就拋出異常是有點不尋常。真正要花代價的是創建異常。幸運的是,好的編程習慣已教會我們,不應該不管三七二十一就拋出異常。異常是為異常的情況而設計的,使用時也應該牢記這一原則。

  24.儘量重用對象

  特別是String對象的使用中,出現字符串連接情況時應使用StringBuffer代替,由於系統不僅要花時間生成對象,以後可能還需要花時間對這些對象進行垃圾回收和處理。因此生成過多的對象將會給程序的性能帶來很大的影響。

  25.不要重複初始化變量

  默認情況下,調用類的構造函數時,java會把變量初始化成確定的值,所有的對象被設置成null,整數變量設置成0,float和double變量設置成0.0,邏輯值設置成false。當一個類從另一個類派生時,這一點尤其應該注意,因為用new關鍵字創建一個對象時,構造函數鏈中的所有構造函數都會被自動調用。

  這裡有個注意,給成員變量設置初始值但需要調用其他方法的時候,最好放在一個方法比如initXXX中,因為直接調用某方法賦值可能會因為類尚未初始化而拋空指針異常,如:public int state = this.getState;

  26.在java+Oracle的應用系統開發中

  在java+Oracle的應用系統開發中,java中內嵌的SQL語言應儘量使用大寫形式,以減少Oracle解析器的解析負擔。

  27.I/O流操作

  在java編程過程中,進行資料庫連接,I/O流操作,在使用完畢後,及時關閉以釋放資源。因為對這些大對象的操作會造成系統大的開銷。

  28.不要在循環中使用Try/Catch語句,應把Try/Catch放在循環最外層

  Error是獲取系統錯誤的類,或者說是虛擬機錯誤的類。不是所有的錯誤Exception都能獲取到的,虛擬機報錯Exception就獲取不到,必須用Error獲取。

  29.通過StringBuffer的構造函數來設定他的初始化容量,可以明顯提升性能

  StringBuffer的默認容量為16,當StringBuffer的容量達到最大容量時,她會將自身容量增加到當前的2倍+2,也就是2*n+2。無論何時,只要StringBuffer到達她的最大容量,她就不得不創建一個新的對象數組,然後複製舊的對象數組,這會浪費很多時間。所以給StringBuffer設置一個合理的初始化容量值,是很有必要的!

  30.創建對象會消耗系統的大量內存

  過分的創建對象會消耗系統的大量內存,嚴重時,會導致內存洩漏,因此,保證過期的對象的及時回收具有重要意義。JVM的GC並非十分智能,因此建議在對象使用完畢後,手動設置成null。

  31.在使用同步機制時

  在使用同步機制時,應儘量使用方法同步代替代碼塊同步。

  32.合理使用java.util.Vector

  Vector與StringBuffer類似,每次擴展容量時,所有現有元素都要賦值到新的存儲空間中。Vector的默認存儲能力為10個元素,擴容加倍。

  vector.add(index,obj) 這個方法可以將元素obj插入到index位置,但index以及之後的元素依次都要向下移動一個位置(將其索引加 1)。 除非必要,否則對性能不利。同樣規則適用於remove(int index)方法,移除此向量中指定位置的元素。將所有後續元素左移(將其索引減 1)。返回此向量中移除的元素。所以刪除vector最後一個元素要比刪除第1個元素開銷低很多。刪除所有元素最好用removeAllElements方法。

  如果要刪除vector裡的一個元素可以使用 vector.remove(obj);而不必自己檢索元素位置,再刪除,如int index = indexOf(obj);vector.remove(index);

  33.不用new關鍵字創建對象的實例

  用new關鍵詞創建類的實例時,構造函數鏈中的所有構造函數都會被自動調用。但如果一個對象實現了Cloneable接口,我們可以調用她的clone方法。clone方法不會調用任何類構造函數。

  下面是Factory模式的一個典型實現:

  

  34.HaspMap的遍歷

  利用散列值取出相應的Entry做比較得到結果,取得entry的值之後直接取key和value。

  

相關焦點

  • Java高級程式設計師須知的並發編程知識
    並發編程簡介並發編程式Java語言的重要特性之一,當然也是最難以掌握的內容。編寫可靠的並發程序是一項不小的挑戰。但是,作為程式設計師的我們,要變得更有價值,就需要啃一些硬骨頭了。因此,理解並發編程的基礎理論和編程實踐,讓自己變得更值錢吧。
  • 程式設計師編程入門必知!程式設計師需要學什麼
    學習語言的過程中還要有機會進行檢驗,不能只編寫代碼,還要檢驗代碼的結果運行是否正確,也就是某些可以運行結果的軟體我們要有,不過許多的程式語言都要求有被程式設計師設計來講代碼轉換成機器能理解的語言的編譯器。其他一些語言,比如Python,使用可以立即轉換成程序而不需要編譯。一些語言有自己的往往包含著代碼編輯器、調試器和/或者翻譯以及調試的IDEs(集成開發環境)。
  • 世界排行第一的程式語言:java迎來25歲生日
    作為全球排名第一的程式語言,本周末Java將迎來 25 歲生日。Java起源於 1991 年的「 Oak」項目,由James Gosling領導。面向對象的Java以其「一次編寫,隨處運行」的可移植性而聞名,因為Java虛擬機支持多種硬體平臺和作業系統以及Java applet可以從網頁上運行。
  • 資深程式設計師大佬告訴你,如何成為一個C++高級程式設計師
    語言我們要成為一個程式設計師,學的東西會很多很雜,但是最開始一定要從語言開始學習,而學習語言最關鍵的莫過於選好一本書,學校的教材就算了,根本沒 有寫得好的。在此隆重推薦《C++ Primer》,這本書很厚,內容也很豐富,對知識的講解不僅僅停留在表面。如果這本書能有耐心看完,語言方面基本就沒有什麼大問題了,對以後的學習也打 下了一個很好的基礎。2.
  • Java程式設計師必備基礎:Java代碼是怎麼運行的?
    前言 作為一名Java程式設計師,我們需要知道Java代碼是怎麼運行的。最近複習了深入理解Java虛擬機,做了一下總結,希望對大家有幫助,如果有不正確的地方,歡迎提出,感激不盡。
  • 程式設計師的這108個笑話 你都看得懂嗎?-程式設計師,笑話,編程, ——快...
    2、程序猿的讀書歷程:x語言入門—>x語言應用實踐—>x語言高階編程—>x語言的科學與藝術—>編程之美—>編程之道—>編程之禪—>頸椎病康復指南。15、殺一個程式設計師不需要用槍,改三次需求就可以了。16、C++程式設計師看不起C程式設計師,C程式設計師看不起java程式設計師,java程式設計師看不起C#程式設計師,C#程式設計師看不起美工。周末了,美工帶著妹子出去約會了,一群SX程式設計師還在加班。17、問:如何生成一個隨機的字符串?答:讓新手退出VIM。18、「我給你出個腦筋急轉彎,你說達文西密碼的上面是什麼?」
  • 程式設計師面試通關的 101 道真題
    在程式設計師的職業生涯中,無論是在跳槽時還是晉升時都會遇到各式各樣的面試,那麼就技術層面上而言,面試有哪些寶典秘籍可供參考,希望本文的 101 道真題能給你幫助。作者 | javinpaul,Java程式設計師譯者 | 彎月,責編 | 屠敏以下為譯文:對程式設計師來說,編程面試有著非凡的意義。
  • 中國程式設計師 VS 美國程式設計師,差距就在這五點
    美國程式設計師大多數都是因為熱愛編程行業而從事這份工作的,他們會專注某一個領域幾十年。50歲以上的程式設計師還會安心待在同一個崗位寫代碼,專研技術。他們想法很簡單, 對於編程這種事情更多的是那種單純似的熱愛。影響因素:國外的程式設計師,專心寫程序並專研,他的級別和工資就會年年往上漲,和做管理的人員沒太大區別。
  • Java程式設計師集合框架面試題
    1、 什麼是Java集合APIJava集合框架API是用來表示和操作集合的統一框架,它包含接口、實現類、以及幫助程式設計師完成一些編程的算法。,這兩個接口不繼承Collection,表示映射而不是真正的集合。
  • 程式設計師加班最困在幾點怎麼熬的?我子時樓底看星星,被保安抓住了
    那話題來了,做為程式設計師,加班到凌晨三四點,五六點肯定是有的,在你通宵加班的過程中,最困的是在幾點?你通過什麼方式熬過去的?12點-1點子時是最困的,我在樓底看星星,然後,就被保安抓住了唄說說我自己,工作這幾年,有幾次通宵加班,但沒幾次好玩的,趴著睡了一會,就起來了,沒什麼特別的地方。比較好玩的是,在十年前,大四,進了軟體園,實訓java,那時叫J2EE企業級開發。
  • 女生適合學編程嗎,各省程式設計師比例分布,哪些是最常用的開發語言...
    中國程式設計師佔全球程式設計師總和的10%。即便如此,我國市場對程式設計師的需求仍然非常旺盛。 女生比例要少的原因,可能還跟程式設計師的加班有關,特別是女生成家後,要麼找不怎麼加班的公司,要麼放棄本職業,轉成產品、技術支持等。
  • 2020年3月全國程式設計師工資出爐,平均工資13820元,Java「錢」景看好!
    特別是當下的薪資變化趨勢,本文達妹為大家總結了2020年2月份中國程式設計師的薪資狀況,讓你入行前,心裡有數。2020年3月,中國大陸程式設計師平均工資13820元,比上個月增加。具體趨勢如圖:整體趨勢各主要程式設計師城市工資變化職能代碼:https://github.com/juwikuang/china_job_surveyIT行業持續火爆,各大計算機程式語言的前景,卻又各不相同。
  • 開發崗位這麼多,為什麼選Java?你學Java了嗎-開課吧
    TIOBE編程排行榜根據全球工程師、課程和搜尋引擎數量為指數得出,在一定程度上反映了程式語言的發展趨勢。富者越富,市場的正反饋讓Java被更多的公司採用,從而需要更多的Java程式設計師。軟體開發可以使用的語法是非常多,但是為什麼Java被廣泛的使用呢?其他程式語言與Java相比,Java語法相對簡單,並且是很多計算機語言的基礎。
  • java軟體工程師的這些要求你有嗎?
    如今java是IT界數一數二的語言,許多程式設計師都想要成為java軟體工程師,那大家知道企業對於java軟體工程師的技術要求有哪些嗎?java軟體工程師的技術要求一.java技術要求:1.具有良好的Java語言基礎,面向對象編程基礎2.熟悉Struts、Hibernate、Spring等主流技術框架3.熟悉XML解析、Excel導出、文件上傳、發送E-mail等常見業務的實現二.資料庫技術要求1.掌握、運用SQLServer
  • Java程式設計師需要什麼學歷才能找到工作?學歷低怎麼辦?
    IT行業薪資很高,很多人只看到了這點,沒發現非常多的人也奔著想拿高薪的念頭往這個行業擠,這麼多人,企業當然要高個子中挑更高的了各種限制也因此而來,學歷,工作經驗,掌握的技能等等Java程式設計師需要什麼學歷才能找到工作?
  • Java NIO 基礎知識
    在 Java 領域,一般性的文件操作確實只需要和 java.io 包打交道就可以了,尤其對於寫業務代碼的程式設計師來說。不過,當你寫了兩三年代碼後,你的業務代碼可能已經寫得很溜了,蒙著眼睛也能寫增刪改查了。這個時候,也許你會想要開始了解更多的底層內容,包括並發、JVM、分布式系統、各個開源框架源碼實現等,處於這個階段的程式設計師會開始認識到 NIO 的用處,因為系統間通訊無處不在。
  • 軟體優化可將CPU性能提升28倍 Intel詳解OneAPI戰略-Intel,優化...
    在CPU及其他晶片開發上,Intel會越來越重視軟體優化的能力,提出六大技術支柱的高級副總Raja Koduri之前表態稱「全新的硬體架構每一個數量級的性能提升,軟體就能帶來兩個數量級的性能提升。」根據Raja Koudri所說,Intel通過軟體優化,可以給Java帶來6倍的性能提升,給持久性內存帶來8倍的性能升級,在AI領域帶來28倍的性能提升,並且,這是在相同的硬體上通過軟體實現的提升。
  • 華為程式設計師面試要改:網上編程90分鐘,現場編程30分鐘
    下面是華為總裁辦電子郵件原文: 《關於公司高端精英類、軟體類人才面試方法調整的建議》 公司當前面試方法是基於過去大規模招聘以快速補充業務發展所需人力的訴求而逐步建立起來的,針對未來戰略領先以及大力提升軟體工程能力所需要的高端精英類、軟體類人才,其考察效果難以滿足要求
  • 性能優化知識圖譜
    - 優化內存佔用- 優化IO- 磁碟IO- 網絡IO### 度量- 吞吐量- 響應時間(Response只讀數據區、常量數據區- 共享存儲區### 調度與CPU運行隊列### 中斷與系統調用## 三、監控- 性能優化
  • Java你只會HelloWord?入門到精通很容易,成為技術大牛不是夢
    Java編程思想《計算機科學叢書:Java編程思想(第4版)》這本書想必學習過Java的人都看過,這本書由淺入深的講解了java編程原理,編程思想講解的很細緻,包括操作符、控制執行流程、訪問權限控制、復用類、多態、接口、通過異常處理錯誤、字符串、泛型、數組、容器深入研究、JavaI/O系統、枚舉類型、並發以及圖形化用戶界面等內容。