1. 如果在靜態(tài)構(gòu)造器中有繁重的計算,也就是耗費CPU的邏輯代碼,請檢查其運行時間是否過度?如果是,將這些邏輯遷移到另外一個單獨的幫助類中。
2. 在進行byte[]作為String的構(gòu)造參數(shù)時,需要將byte數(shù)組的一部分做個復(fù)制拷貝,否則,構(gòu)造器會為整個原始緩沖做一個臨時拷貝;試圖避免不必要的內(nèi)存分配,因為在內(nèi)存使用超過1G+以上時會影響程序的性能
3. 變量對于大多數(shù)程序是非常有用的,因為它們縮短了代碼,但是當(dāng)變量的所有成員已經(jīng)確認是不變的常量,那么使用預(yù)編譯的數(shù)組替代。
4. 盡可能使用StringBuilder替代StringBuffer。
5. 使用閃存SSD替代傳統(tǒng)的硬盤HDD,這樣你可以將你的應(yīng)用程序從I/O-bound轉(zhuǎn)變到CPU-bound,這對于設(shè)計到read/write流操作特別有用;現(xiàn)代操作系統(tǒng)都是在后臺寫數(shù)據(jù),不會堵塞你的應(yīng)用,你的寫操作只有在操作系統(tǒng)寫入磁盤的速度慢于你的應(yīng)用產(chǎn)生數(shù)據(jù)的速度時,才會堵塞你的寫操作請求
6. 如果你的內(nèi)存中有字符串或帶有String字段的對象的大量集合,在某些情況下,字少10%場景,這些字符串實際上可能會轉(zhuǎn)換為基本類型的值,你可以使用Object字段替代你的String字段,使用其提供的pack/unpack方法在字符串和對象之間來回轉(zhuǎn)換,這樣節(jié)省內(nèi)存。如果你不將字符串轉(zhuǎn)換為基本類型,可以考慮將字符串轉(zhuǎn)為UTF-8的byte[],可以隨時將byte[]轉(zhuǎn)回原始字符串。
7. 如果有大量重復(fù)的字符串,使用String.intern() 減少內(nèi)存損耗,提高性能
8. 嘗試使用Google protobuf 或類似編碼技術(shù)編碼你整數(shù)數(shù)據(jù),特別是這些數(shù)據(jù)值很小的情況下,這樣你會得到數(shù)據(jù)量大幅度減小后導(dǎo)致的低CPU損耗,能夠幫助你提高每個時間單元中存儲或讀取更多消息數(shù)量。
9. 如果使用 array list/set/map 時,其key或值是基本類型,那么使用Trove的 maps/sets替代JDK maps/sets,可以節(jié)省大量內(nèi)存。
10. 當(dāng)你的應(yīng)用堆heap大小超過32G時, JVM會切換到64位的對象引用,意味著你的應(yīng)用已經(jīng)結(jié)束了占用更少Heap空間的階段。
11. 如果你使用內(nèi)部類,缺省使用靜態(tài)的內(nèi)部類;如果你使用一堆小的集合Collection,那么試試使用 java.util.Collections.empty*/singleton*方法實現(xiàn)小集合的內(nèi)存高效率存儲;使用BitSet替代boolean的arrays/lists或一系列integer整數(shù)類型,bit set是內(nèi)存和CPU緩存都很友好。
12. 不要在多線程中共享一個 java.util.Random實例,將其包裝在ThreadLocal中,Java7中使用java.util.concurrent.ThreadLocalRandom替代java.util.Random 。
13. 如果你希望有快速的Base64編碼器,使用Java 8的 java.util.Base64
14. 不要使用exception ,每個exception 啟動需要1毫秒
15. 如果你使用:
if ( !set.contains( key ) )
{
set.add( key );
//some extra code here
}
復(fù)制
直接使用add更快:
if ( set.add( key ) ){
//same extra code could be added here
}
復(fù)制
同樣,contains+remove可以被remove直接替代。
16. 如果要使用壓縮,考慮使用LZ4(https://github.com/lz4/lz4-java)
17. 使用ByteBuffer替代 ByteArrayOutputStream。
18. 如果你希望計算幾天這樣的短天數(shù),那么基于int/long進行手工實現(xiàn)會更快些。
19. 使用Matcher 和 Pattern 替代String.matches, split, replaceAll, replaceFirst等方法。
20. 如果你希望有一個快速的LinkedList代碼實現(xiàn),考慮下面規(guī)則:
- 使用ArrayDeque實現(xiàn)基于隊列queue-based的算法
- 使用LinkedList的ListIterator
- 避免使用任何LinkedList方法接受或返回集合中元素的索引。
- 再次檢查是否有理由使用LinkedList
21. 如果使用ArrayList,考慮下面規(guī)則:文章來源:http://www.zghlxwxcb.cn/news/detail-511015.html
- 將元素追加到集合尾部。
- 也從尾部移除元素
- 避免contains, indexOf 和remove(Object) 方法
- 避免更多的removeAll和retainAll 方法
- 使用subList(int, int).clear() 來清除集合中的一部分。
22.Java 8中使用G1垃圾回收機制時,使用減少字符串重復(fù)配置: -XX:+UseG1GC -XX:+UseStringDeduplication。文章來源地址http://www.zghlxwxcb.cn/news/detail-511015.html
到了這里,關(guān)于Java性能優(yōu)化技巧的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!