J2EE系統最佳化的幾點體會(一、對象)
來源:互聯網
上載者:User
說到系統最佳化,是一個比較複雜的問題,涉及到軟體的各個方面:需求、模組劃分、資料庫設計、程式編碼以及一些特殊的最佳化方法如緩衝技術等。而不同的應用又有其特殊的最佳化策略和技術。同時最佳化是貫穿系統從需求到實現再到維護的各個階段的一項活動,而在各個階段又有其不同的著眼點和具體方法。
本文立足於具體的J2EE項目實踐,結合一些已有的最佳化條例,提出自己的一些體會,也算是作為一次對實際項目經驗教訓的總結。
最佳化一般意義上說是提高已有系統的效能,減少如記憶體、資料庫、網路頻寬等資源的佔用,是在系統開發告一段落的前提下進行。一般是通過壓力測試或具體使用發現效能方面的問題,然後尋找效能瓶頸,並結合項目進度、人員安排、技術儲備等因素,提出相應的最佳化策略。
下面結合一些案例,進行具體的討論,並希望能總結出一些具有代表性的條例:
條例一:盡量重用對象,避免建立過多短時對象
對象在物件導向編程中隨處可見,甚至可以毫不誇張的說是:“一切都是對象”。如何更好的建立和使用對象,是最佳化中要考慮的一個重要方面。筆者將對象按使用分為兩大類:獨享對象和共用對象。獨享對象指由某個線程單獨擁有並維護其生命週期的對象,一般是通過new 建立的對象,線程結束且無其它對這個對象的引用,這個對象將由垃圾收集機制自動GC。共用對象指由多個線程共用的對象,各線程保持多個指向同一個對象的引用,任何對這個對象的修改都會在其它引用上得到體現,共用對象一般通過Factory工廠的getInstace()方法建立,單例模式就是建立共用對象的標準實現。獨享對象由於無其它指向同一對象的引用,不用擔心其它引用對對象屬性的修改,在多線程環境裡,也就不需要對其可能修改屬性的方法加以同步,減少了出錯的隱患和複雜性,但由於需要為每個線程都建立對象,增加了對記憶體的需求和JVM GC的負擔。共用對象則需要進行適當的同步(避免較大的同步塊,同時防止死結)。
還有幾種特殊對象:不變對象和方法對象。不變對象指對象對外不含有修改對象屬性的方法(如set方法),外部要修改屬性只能通過new新的執行個體來實現。不變對象最大的好處就是無需擔心屬性被修改,避免了潛在的bug,並能無需任何額外工作(如同步)就很好的工作在多線程環境下。如jdk的String對象就是典型的不變對象。方法對象簡單的說就是僅包含方法,不含有屬性的對象。由於沒有對象屬性,方法中無需進行修改屬性的操作,也就能採用static方法或單例模式,避免每次使用都要new對象,減少對象的使用。