真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

java代碼gc優(yōu)化 java代碼優(yōu)化的方法和準(zhǔn)則

Java代碼如何優(yōu)化

1. 盡量在合適的場(chǎng)合使用單例

成都創(chuàng)新互聯(lián)主營(yíng)南京網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都app軟件開(kāi)發(fā)公司,南京h5小程序設(shè)計(jì)搭建,南京網(wǎng)站營(yíng)銷(xiāo)推廣歡迎南京等地區(qū)企業(yè)咨詢(xún)

使用單例可以減輕加載的負(fù)擔(dān),縮短加載的時(shí)間,提高加載的效率,但并不是所有地方都適用于單例,簡(jiǎn)單來(lái)說(shuō),單例主要適用于以下三個(gè)方面:

第一,控制資源的使用,通過(guò)線程同步來(lái)控制資源的并發(fā)訪問(wèn);

第二,控制實(shí)例的產(chǎn)生,以達(dá)到節(jié)約資源的目的;

第三,控制數(shù)據(jù)共享,在不建立直接關(guān)聯(lián)的條件下,讓多個(gè)不相關(guān)的進(jìn)程或線程之間實(shí)現(xiàn)通信。

2. 盡量避免隨意使用靜態(tài)變量

要知道,當(dāng)某個(gè)對(duì)象被定義為stataic變量所引用,那么gc通常是不會(huì)回收這個(gè)對(duì)象所占有的內(nèi)存

3. 盡量避免過(guò)多過(guò)常的創(chuàng)建Java對(duì)象

盡量避免在經(jīng)常調(diào)用的方法,循環(huán)中new對(duì)象,由于系統(tǒng)不僅要花費(fèi)時(shí)間來(lái)創(chuàng)建對(duì)象,而且還要花時(shí)間對(duì)這些對(duì)象進(jìn)行垃圾回收和處理,在我們可以控制的范圍內(nèi),最大限度的重用對(duì)象,最好能用基本的數(shù)據(jù)類(lèi)型或數(shù)組來(lái)替代對(duì)象。

4. 盡量使用final修飾符

帶有final修飾符的類(lèi)是不可派生的。在Java核心API中,有許多應(yīng)用final的例子,例如java.lang.String.為String類(lèi)指定final防止了使用者覆蓋length()方法。另外,如果一個(gè)類(lèi)是final的,則該類(lèi)所有方法都是final的。Java編譯器會(huì)尋找機(jī)會(huì)內(nèi)聯(lián)(inline)所有的final方法(這和具體的編譯器實(shí)現(xiàn)有關(guān))。此舉能夠使性能平均提高50%.

5. 盡量使用局部變量

調(diào)用方法時(shí)傳遞的參數(shù)以及在調(diào)用中創(chuàng)建的臨時(shí)變量都保存在棧(Stack)中,速度較快。其他變量,如靜態(tài)變量、實(shí)例變量等,都在堆(Heap)中創(chuàng)建,速度較慢。

6. 盡量處理好包裝類(lèi)型和基本類(lèi)型兩者的使用場(chǎng)所

雖然包裝類(lèi)型和基本類(lèi)型在使用過(guò)程中是可以相互轉(zhuǎn)換,但它們兩者所產(chǎn)生的內(nèi)存區(qū)域是完全不同的,基本類(lèi)型數(shù)據(jù)產(chǎn)生和處理都在棧中處理,包裝類(lèi)型是對(duì)象,是在堆中產(chǎn)生實(shí)例。

在集合類(lèi)對(duì)象,有對(duì)象方面需要的處理適用包裝類(lèi)型,其他的處理提倡使用基本類(lèi)型。

7. 慎用synchronized,盡量減小synchronize的方法

都知道,實(shí)現(xiàn)同步是要很大的系統(tǒng)開(kāi)銷(xiāo)作為代價(jià)的,甚至可能造成死鎖,所以盡量避免無(wú)謂的同步控制。synchronize方法被調(diào)用時(shí),直接會(huì)把當(dāng)前對(duì)象鎖 了,在方法執(zhí)行完之前其他線程無(wú)法調(diào)用當(dāng)前對(duì)象的其他方法。所以synchronize的方法盡量小,并且應(yīng)盡量使用方法同步代替代碼塊同步。

8. 盡量使用StringBuilder和StringBuffer進(jìn)行字符串連接

這個(gè)就不多講了。

9. 盡量不要使用finalize方法

實(shí)際上,將資源清理放在finalize方法中完成是非常不好的選擇,由于GC的工作量很大,尤其是回收Young代內(nèi)存時(shí),大都會(huì)引起應(yīng)用程序暫停,所以再選擇使用finalize方法進(jìn)行資源清理,會(huì)導(dǎo)致GC負(fù)擔(dān)更大,程序運(yùn)行效率更差。

10. 盡量使用基本數(shù)據(jù)類(lèi)型代替對(duì)象

String str = "hello";

上面這種方式會(huì)創(chuàng)建一個(gè)"hello"字符串,而且JVM的字符緩存池還會(huì)緩存這個(gè)字符串;

String str = new String("hello");

此時(shí)程序除創(chuàng)建字符串外,str所引用的String對(duì)象底層還包含一個(gè)char[]數(shù)組,這個(gè)char[]數(shù)組依次存放了h,e,l,l,o

11. 單線程應(yīng)盡量使用HashMap、ArrayList

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

12. 盡量合理的創(chuàng)建HashMap

當(dāng)你要?jiǎng)?chuàng)建一個(gè)比較大的hashMap時(shí),充分利用另一個(gè)構(gòu)造函數(shù)

public HashMap(int initialCapacity, float loadFactor)

避免HashMap多次進(jìn)行了hash重構(gòu),擴(kuò)容是一件很耗費(fèi)性能的事,在默認(rèn)中initialCapacity只有16,而loadFactor是 0.75,需要多大的容量,你最好能準(zhǔn)確的估計(jì)你所需要的最佳大小,同樣的Hashtable,Vectors也是一樣的道理。

13. 盡量減少對(duì)變量的重復(fù)計(jì)算

并且在循環(huán)中應(yīng)該避免使用復(fù)雜的表達(dá)式,在循環(huán)中,循環(huán)條件會(huì)被反復(fù)計(jì)算,如果不使用復(fù)雜表達(dá)式,而使循環(huán)條件值不變的話,程序?qū)?huì)運(yùn)行的更快。

14. 盡量避免不必要的創(chuàng)建

15. 盡量在finally塊中釋放資源

程序中使用到的資源應(yīng)當(dāng)被釋放,以避免資源泄漏。這最好在finally塊中去做。不管程序執(zhí)行的結(jié)果如何,finally塊總是會(huì)執(zhí)行的,以確保資源的正確關(guān)閉。

16. 盡量使用移位來(lái)代替'a/b'的操作

"/"是一個(gè)代價(jià)很高的操作,使用移位的操作將會(huì)更快和更有效

17.盡量使用移位來(lái)代替'a*b'的操作

同樣的,對(duì)于'*'操作,使用移位的操作將會(huì)更快和更有效

18. 盡量確定StringBuffer的容量

StringBuffer 的構(gòu)造器會(huì)創(chuàng)建一個(gè)默認(rèn)大小(通常是16)的字符數(shù)組。在使用中,如果超出這個(gè)大小,就會(huì)重新分配內(nèi)存,創(chuàng)建一個(gè)更大的數(shù)組,并將原先的數(shù)組復(fù)制過(guò)來(lái),再 丟棄舊的數(shù)組。在大多數(shù)情況下,你可以在創(chuàng)建 StringBuffer的時(shí)候指定大小,這樣就避免了在容量不夠的時(shí)候自動(dòng)增長(zhǎng),以提高性能。

19. 盡量早釋放無(wú)用對(duì)象的引用

大部分時(shí),方法局部引用變量所引用的對(duì)象 會(huì)隨著方法結(jié)束而變成垃圾,因此,大部分時(shí)候程序無(wú)需將局部,引用變量顯式設(shè)為null.

20. 盡量避免使用二維數(shù)組

二維數(shù)據(jù)占用的內(nèi)存空間比一維數(shù)組多得多,大概10倍以上。

21. 盡量避免使用split

除非是必須的,否則應(yīng)該避免使用split,split由于支持正則表達(dá)式,所以效率比較低,如果是頻繁的幾十,幾百萬(wàn)的調(diào)用將會(huì)耗費(fèi)大量資源,如果確實(shí)需 要頻繁的調(diào)用split,可以考慮使用apache的StringUtils.split(string,char),頻繁split的可以緩存結(jié)果。

22. ArrayList LinkedList

一 個(gè)是線性表,一個(gè)是鏈表,一句話,隨機(jī)查詢(xún)盡量使用ArrayList,ArrayList優(yōu)于LinkedList,LinkedList還要移動(dòng)指 針,添加刪除的操作LinkedList優(yōu)于ArrayList,ArrayList還要移動(dòng)數(shù)據(jù),不過(guò)這是理論性分析,事實(shí)未必如此,重要的是理解好2 者得數(shù)據(jù)結(jié)構(gòu),對(duì)癥下藥。

23. 盡量使用System.arraycopy ()代替通過(guò)來(lái)循環(huán)復(fù)制數(shù)組

System.arraycopy() 要比通過(guò)循環(huán)來(lái)復(fù)制數(shù)組快的多

24. 盡量緩存經(jīng)常使用的對(duì)象

盡可能將經(jīng)常使用的對(duì)象進(jìn)行緩存,可以使用數(shù)組,或HashMap的容器來(lái)進(jìn)行緩存,但這種方式可能導(dǎo)致系統(tǒng)占用過(guò)多的緩存,性能下降,推薦可以使用一些第三方的開(kāi)源工具,如EhCache,Oscache進(jìn)行緩存,他們基本都實(shí)現(xiàn)了FIFO/FLU等緩存算法。

25. 盡量避免非常大的內(nèi)存分配

有時(shí)候問(wèn)題不是由當(dāng)時(shí)的堆狀態(tài)造成的,而是因?yàn)榉峙涫≡斐傻摹7峙涞膬?nèi)存塊都必須是連續(xù)的,而隨著堆越來(lái)越滿,找到較大的連續(xù)塊越來(lái)越困難。

26. 慎用異常

當(dāng)創(chuàng)建一個(gè)異常時(shí),需要收集一個(gè)棧跟蹤(stack track),這個(gè)棧跟蹤用于描述異常是在何處創(chuàng)建的。構(gòu)建這些棧跟蹤時(shí)需要為運(yùn)行時(shí)棧做一份快照,正是這一部分開(kāi)銷(xiāo)很大。當(dāng)需要?jiǎng)?chuàng)建一個(gè) Exception 時(shí),JVM 不得不說(shuō):先別動(dòng),我想就您現(xiàn)在的樣子存一份快照,所以暫時(shí)停止入棧和出棧操作。棧跟蹤不只包含運(yùn)行時(shí)棧中的一兩個(gè)元素,而是包含這個(gè)棧中的每一個(gè)元素。

如 果您創(chuàng)建一個(gè) Exception ,就得付出代價(jià)。好在捕獲異常開(kāi)銷(xiāo)不大,因此可以使用 try-catch 將核心內(nèi)容包起來(lái)。從技術(shù)上講,您甚至可以隨意地拋出異常,而不用花費(fèi)很大的代價(jià)。招致性能損失的并不是 throw 操作--盡管在沒(méi)有預(yù)先創(chuàng)建異常的情況下就拋出異常是有點(diǎn)不尋常。真正要花代價(jià)的是創(chuàng)建異常。幸運(yùn)的是,好的編程習(xí)慣已教會(huì)我們,不應(yīng)該不管三七二十一就 拋出異常。異常是為異常的情況而設(shè)計(jì)的,使用時(shí)也應(yīng)該牢記這一原則。

(1)。 用Boolean.valueOf(boolean b)代替new Boolean()

包裝類(lèi)的內(nèi)存占用是很恐怖的,它是基本類(lèi)型內(nèi)存占用的N倍(N2),同時(shí)new一個(gè)對(duì)象也是性能的消耗。

(2)。 用Integer.valueOf(int i)代替new Integer()

和Boolean類(lèi)似,java開(kāi)發(fā)中使用Integer封裝int的場(chǎng)合也非常多,并且通常用int表示的數(shù)值都非常小。SUN SDK中對(duì)Integer的實(shí)例化進(jìn)行了優(yōu)化,Integer類(lèi)緩存了-128到127這256個(gè)狀態(tài)的Integer,如果使用 Integer.valueOf(int i),傳入的int范圍正好在此內(nèi),就返回靜態(tài)實(shí)例。這樣如果我們使用Integer.valueOf代替new Integer的話也將大大降低內(nèi)存的占用。

(3)。 用StringBuffer的append方法代替"+"進(jìn)行字符串相加。

這個(gè)已經(jīng)被N多人說(shuō)過(guò)N次了,這個(gè)就不多說(shuō)了。

(4)。 避免過(guò)深的類(lèi)層次結(jié)構(gòu)和過(guò)深的方法調(diào)用。

因?yàn)檫@兩者都是非常占用內(nèi)存的(特別是方法調(diào)用更是堆??臻g的消耗大戶)。

(5)。 變量只有在用到它的時(shí)候才定義和實(shí)例化。

這是初學(xué)者最容易犯的錯(cuò),合理的使用變量,并且只有在用到它的時(shí)候才定義和實(shí)例化,能有效的避免內(nèi)存空間和執(zhí)行性能上的浪費(fèi),從而提高了代碼的效率。

(6)。 避免在循環(huán)體中聲明創(chuàng)建對(duì)象,即使該對(duì)象占用內(nèi)存空間不大。

這種情況在我們的實(shí)際應(yīng)用中經(jīng)常遇到,而且我們很容易犯類(lèi)似的錯(cuò)誤

采用上面的第二種編寫(xiě)方式,僅在內(nèi)存中保存一份對(duì)該對(duì)象的引用,而不像上面的第一種編寫(xiě)方式中代碼會(huì)在內(nèi)存中產(chǎn)生大量的對(duì)象引用,浪費(fèi)大量的內(nèi)存空間,而且增大了垃圾回收的負(fù)荷。因此在循環(huán)體中聲明創(chuàng)建對(duì)象的編寫(xiě)方式應(yīng)該盡量避免。

(7)。 如果if判斷中多個(gè)條件用'||'或者''連接,請(qǐng)將出現(xiàn)頻率最高的條件放在表達(dá)式最前面。

這個(gè)小技巧往往能有效的提高程序的性能,尤其是當(dāng)if判斷放在循環(huán)體里面時(shí),效果更明顯。

1.JVM管理兩種類(lèi)型的內(nèi)存:堆內(nèi)存(heap),棧內(nèi)存(stack),堆內(nèi)在主要用來(lái)存儲(chǔ)程序在運(yùn)行時(shí)創(chuàng)建或?qū)嵗膶?duì)象與變量。而棧內(nèi)存則是用來(lái)存儲(chǔ)程序代碼中聲明為靜態(tài)(static)(或非靜態(tài))的方法。

2.JVM中對(duì)象的生命周期,創(chuàng)建階段,應(yīng)用階段,不可視階段,不可到達(dá)階段,可收集階段,終結(jié)階段,釋放階段

3.避免在循環(huán)體中創(chuàng)建對(duì)象,即使該對(duì)象點(diǎn)用內(nèi)存空間不大。

4.軟引用的主要特點(diǎn)是具有較強(qiáng)的引用功能。只有當(dāng)內(nèi)存不夠的時(shí)候,才回收這類(lèi)內(nèi)存,因此在內(nèi)存足夠的時(shí)候,它們通常不被回收。它可以用于實(shí)現(xiàn)一些常用資源的緩存,實(shí)現(xiàn)Cache的功能

5.弱引用對(duì)象與Soft引用對(duì)象最大不同就在于:GC在進(jìn)行回收時(shí),需要通過(guò)算法檢查是否回收Soft引用對(duì)象,而對(duì)于Weak引用對(duì)象,GC總是進(jìn)行回收。

6.共享靜態(tài)變量存儲(chǔ)空間

7.有時(shí)候我們?yōu)榱颂岣呦到y(tǒng)性能,避免重復(fù)耗時(shí)的操作,希望能夠重用一些創(chuàng)建完成的對(duì)象,利用對(duì)象池實(shí)現(xiàn)。類(lèi)似JDBC連接池。

8.瞬間值,序列化對(duì)象大變量時(shí),如果此大變量又沒(méi)有用途,則使用transient聲明,不序列化此變量。同時(shí)網(wǎng)絡(luò)傳輸中也不傳輸。

9.不要提前創(chuàng)建對(duì)象

10 .(1)最基本的建議就是盡早釋放無(wú)用對(duì)象的引用

A a = new A();

a = null; //當(dāng)使用對(duì)象a之后主動(dòng)將其設(shè)置為空

(2)盡量少用finalize函數(shù)。

(3) 如果需要使用經(jīng)常用到的圖片展,可以使用軟引用。

(4) 注意集合數(shù)據(jù)類(lèi)型,包括數(shù)組,樹(shù)等數(shù)據(jù),這些數(shù)據(jù)結(jié)構(gòu)對(duì)GC來(lái)說(shuō),回收更為復(fù)雜,

(5) 盡量避免在類(lèi)的默認(rèn)構(gòu)造器中創(chuàng)建,初始化大量的對(duì)象,防止在調(diào)用其自類(lèi)的構(gòu)造器時(shí)造成不必要的內(nèi)存資源浪費(fèi)。

(6) 盡量避免強(qiáng)制系統(tǒng)做垃圾內(nèi)存回收。

(7) 盡量避免顯式申請(qǐng)數(shù)組空間。

(8) 盡量在合適的場(chǎng)景下使用對(duì)象池技術(shù)以提高系統(tǒng)性能,縮減系統(tǒng)內(nèi)存開(kāi)銷(xiāo)。

11.當(dāng)做數(shù)組拷貝操作時(shí),采用System.arraycopy()方法完成拷貝操作要比采用循環(huán)的辦法完成數(shù)組拷貝操作效率高

12. 盡量避免在循環(huán)體中調(diào)用方法,因?yàn)榉椒ㄕ{(diào)用是比較昂貴的。

13. 盡量避免在循環(huán)體中使用try-catch 塊,最好在循環(huán)體外使用try--catch塊以提高系統(tǒng)性能。

14. 在多重循環(huán)中,如果有可能,盡量將最長(zhǎng)的循環(huán)放在最內(nèi)層,最短的循環(huán)放在最外層,以減少循環(huán)層間的變換次數(shù)。

15. 在需要線程安全的情況下,使用List list = Collections.synchronizedList(new ArrayList());

16. 如果預(yù)知長(zhǎng)度,就設(shè)置ArrayList的長(zhǎng)度。

17. ArrayList 與 LinkedList 選擇,熟悉底層的實(shí)現(xiàn)原理,選擇適當(dāng)?shù)娜萜鳌?/p>

18. 字符串累加采用StringBuffer.

19. 系統(tǒng)I/O優(yōu)化,采用緩沖和壓縮技術(shù)。優(yōu)化性能。

20. 避免在類(lèi)在構(gòu)造器的初始化其他類(lèi)

21 盡量避免在構(gòu)造中對(duì)靜態(tài)變量做賦值操作

22. 不要在類(lèi)的構(gòu)造器中創(chuàng)建類(lèi)的實(shí)例

23. 組合優(yōu)化繼承

24. 最好通過(guò)Class.forname() 動(dòng)態(tài)的裝載類(lèi)

25. JSP優(yōu)化,采用out 對(duì)象中的print方法代替println()方法

26 .采用ServletOutputStream 對(duì)象代替JSPWriter對(duì)象

27. 采用適當(dāng)?shù)闹党跏蓟痮ut 對(duì)象緩沖區(qū)的大小

28. 盡量采用forward()方法重定向新的JSP

29. 利用線程池技術(shù)處理客戶請(qǐng)求

30.Servlet優(yōu)化

(1) 通過(guò)init()方法來(lái)緩存一些靜態(tài)數(shù)據(jù)以提高應(yīng)用性能。

(2) 用print() 方法取代println()方法。

(3) 用ServletOutputStream 取代 PrintWriter.

(4) 盡量縮小同步代碼數(shù)量

31. 改善Servlet應(yīng)用性能的方法

(1)不要使用SingleThreadModel

(2)使用線程池ThreadPool

32. EJB優(yōu)化

實(shí)體EJB:

(1)實(shí)體EJB中常用數(shù)據(jù)緩存與釋放

(2)采用延遲加載的方式裝載關(guān)聯(lián)數(shù)據(jù)

(3)盡可能地應(yīng)用CMP類(lèi)型實(shí)體EJB

(4)直接采用JDBC技術(shù)處理大型數(shù)據(jù)

33. 優(yōu)化JDBC連接

(1)設(shè)置合適的預(yù)取行值

(2)采用連接池技術(shù)

(3)全合理應(yīng)用事務(wù)

(4)選擇合適的事務(wù)隔離層與及時(shí)關(guān)閉連接對(duì)象

34. PreparedStatemetn只編譯解析一次,而Statement每次都編譯解析。

35. 盡可能地做批處理更新

36. 通過(guò)采用合適的getXXX方法提高系統(tǒng)性能

37. 采用設(shè)計(jì)模式。

Java養(yǎng)成什么樣的編程習(xí)慣可以有利于GC

作者:RednaxelaFX

鏈接:

來(lái)源:知乎

著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

Java怎樣的編程習(xí)慣有利于GC,這硬要扣細(xì)節(jié)的話一定要結(jié)合具體的JVM實(shí)現(xiàn)才可以分析,因?yàn)楦鱾€(gè)JVM甚至同一個(gè)JVM里的各個(gè)GC實(shí)現(xiàn)都會(huì)有不同的特點(diǎn)。

但通用的、通常管用的建議,其實(shí)很簡(jiǎn)單:

寫(xiě)簡(jiǎn)單直觀的代碼,不要玩花招。過(guò)分設(shè)計(jì)、過(guò)多的封裝/抽象層,常常會(huì)讓GC很難受(導(dǎo)致需要處理的對(duì)象增多)。

要理解:GC是伙伴,不是仆人。在保持代碼結(jié)構(gòu)良好、直觀易懂的前提下,減少?zèng)]必要的對(duì)象分配總是好的。

不要調(diào)用System.gc() - 可能影響GC的統(tǒng)計(jì)數(shù)據(jù)和未來(lái)決策

不要隨意使用“對(duì)象池” - 為了優(yōu)化GC而使用對(duì)象池常常是非常有害的。為了別的有用的目的,例如說(shuō)持有初始化開(kāi)銷(xiāo)高的資源而使用對(duì)象池,這才是通常可取的場(chǎng)景。

通常不用關(guān)心對(duì)局部變量置null - 開(kāi)頭的傳送門(mén)有詳細(xì)講解

小心使用ThreadLocal,特別是當(dāng)跟線程池搭配使用的時(shí)候 - 如果用線程池來(lái)跑任務(wù),而這些任務(wù)向ThreadLocal寫(xiě)入了數(shù)據(jù),那么應(yīng)該注意在任務(wù)完成時(shí)清理ThreadLocal,不然容易泄漏

如果使用堆外內(nèi)存來(lái)實(shí)現(xiàn)Java對(duì)象的緩存,而且在堆外內(nèi)存里存的是序列化后的Java對(duì)象的話,要小心使用時(shí)的反序列化開(kāi)銷(xiāo)及其伴隨的頻繁創(chuàng)建對(duì)象的開(kāi)銷(xiāo)。

如果程序里有使用NIO,要關(guān)注DirectByteBuffer的使用狀況;例如說(shuō)如果禁用了System.gc()并且程序調(diào)優(yōu)過(guò)使得GC頻率非常低的話,死掉的DirectByteBuffer可能會(huì)得不到及時(shí)的釋放。請(qǐng)參考這個(gè)傳送門(mén)的第1點(diǎn):[HotSpot VM] JVM調(diào)優(yōu)的"標(biāo)準(zhǔn)參數(shù)"的各種陷阱

經(jīng)常查看與分析GC日志(或者通過(guò)別的方式,例如JMX,來(lái)做類(lèi)似的監(jiān)控) - 沒(méi)問(wèn)題就別亂優(yōu)化,有問(wèn)題要及時(shí)發(fā)現(xiàn)和分析

關(guān)于GC是伙伴不是仆人:意思是說(shuō),雖然很偶爾會(huì)遇到GC自身有bug而導(dǎo)致內(nèi)存泄漏,但一般來(lái)說(shuō)還是可以信任JVM的GC可以收集程序不需要的所有垃圾對(duì)象的。但這應(yīng)該是一個(gè)雙向溝通(伙伴)的模型,而不是一個(gè)單向發(fā)出命令(仆人)的模型。我們可以寫(xiě)程序,GC會(huì)知道要收集哪些對(duì)象;反過(guò)來(lái),GC會(huì)給我們反饋(GC日志、JMX監(jiān)控,等等),告訴我們它表現(xiàn)得如何,是否需要我們的幫助來(lái)改進(jìn)它的表現(xiàn)。

Java代碼優(yōu)化的常用方法有什么

1)盡量指定類(lèi)、方法的final修飾符。帶有final修飾符的類(lèi)是不可派生的,Java編譯器會(huì)尋找機(jī)會(huì)內(nèi)聯(lián)所有的final方法,內(nèi)聯(lián)對(duì)于提升Java運(yùn)行效率作用重大,此舉能夠使性能平均提高50%。

2)盡量重用對(duì)象。由于Java虛擬機(jī)不僅要花時(shí)間生成對(duì)象,以后可能還需要花時(shí)間對(duì)這些對(duì)象進(jìn)行垃圾回收和處理,因此生成過(guò)多的對(duì)象將會(huì)給程序的性能帶來(lái)很大的影響。

3)盡可能使用局部變量。調(diào)用方法時(shí)傳遞的參數(shù)以及在調(diào)用中創(chuàng)建的臨時(shí)變量都保存在棧中速度較快,其他變量,如靜態(tài)變量、實(shí)例變量等,都在堆中創(chuàng)建速度較慢。

4)慎用異常。異常對(duì)性能不利,只要有異常被拋出,Java虛擬機(jī)就必須調(diào)整調(diào)用堆棧,因?yàn)樵谔幚磉^(guò)程中創(chuàng)建了一個(gè)新的對(duì)象。異常只能用于錯(cuò)誤處理,不應(yīng)該用來(lái)控制程序流程。

5)乘法和除法使用移位操作。用移位操作可以極大地提高性能,因?yàn)樵谟?jì)算機(jī)底層,對(duì)位的操作是最方便、最快的,但是移位操作雖然快,可能會(huì)使代碼不太好理解,因此最好加上相應(yīng)的注釋。

6)盡量使用HashMap、ArrayList、StringBuilder,除非線程安全需要,否則不推薦使用 Hashtable、Vector、StringBuffer,后三者由于使用同步機(jī)制而導(dǎo)致了性能開(kāi)銷(xiāo)。

盡量在合適的場(chǎng)合使用單例。使用單例可以減輕加載的負(fù)擔(dān)、縮短加載的時(shí)間、提高加載的效率,但并不是所有地方都適用于單例。


當(dāng)前題目:java代碼gc優(yōu)化 java代碼優(yōu)化的方法和準(zhǔn)則
網(wǎng)頁(yè)URL:http://weahome.cn/article/dosiode.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部