技巧1:預(yù)測收集容量
所有標(biāo)準(zhǔn)java集合,以及大多數(shù)自定義和擴(kuò)展實現(xiàn)(如Trove和Google的Guava)都使用底層數(shù)組(基于原語或基于對象)。由于數(shù)組在分配后大小是不可變的,因此在許多情況下,向集合中添加項可能會導(dǎo)致刪除舊的底層數(shù)組,而選擇新分配的較大數(shù)組。大多數(shù)集合實現(xiàn)都試圖優(yōu)化此重新分配過程,并將其保持在攤銷最小值,即使未提供集合的預(yù)期大小。但是,通過在構(gòu)建時為集合提供其預(yù)期大小,可以實現(xiàn)最佳效果。
技巧2:直接處理流程
在處理數(shù)據(jù)流時,例如從文件讀取的數(shù)據(jù)或通過網(wǎng)絡(luò)下載的數(shù)據(jù),通常會看到以下內(nèi)容:
然后,可以將生成的字節(jié)數(shù)組解析為XML文檔、JSON對象或協(xié)議緩沖區(qū)消息,以列舉一些流行選項。
在處理大型文件或大小不可預(yù)測的文件時,這顯然是一個壞主意,因為如果JVM無法實際分配整個文件大小的緩沖區(qū),它會使我們暴露出OutOfMemory錯誤。在java培訓(xùn)中,有很多關(guān)于GC的培訓(xùn)課程,在專業(yè)老師的教學(xué)指導(dǎo)下,可以很全面地掌握GC的相關(guān)知識和技能。
更好的方法是使用適當(dāng)?shù)腎nputStream(本例中為FileInputStream)并將其直接提供給解析器,而無需首先將整個內(nèi)容讀入字節(jié)數(shù)組。所有主要庫都公開API以直接解析流,例如:
技巧3:使用不可變對象
不變性有許多優(yōu)點。它對垃圾收集的影響很少得到應(yīng)有的關(guān)注。不可變對象是一個對象,其字段(在本例中特別是非基本字段)在對象構(gòu)造后無法修改。
不變性意味著不可變?nèi)萜饕玫乃袑ο蠖际窃谌萜鳂?gòu)造完成之前創(chuàng)建的。在GC術(shù)語中:容器至少和它所持有的最年輕引用一樣年輕。這意味著,當(dāng)對年輕代執(zhí)行垃圾收集循環(huán)時,GC可以跳過位于較老代中的不可變對象,因為它確定這些對象不能引用正在收集的代中的任何對象。要掃描的對象越少意味著要掃描的內(nèi)存頁越少,而要掃描的內(nèi)存頁越少意味著GC周期越短,這意味著GC暫停時間越短,總體吞吐量越好。想學(xué)習(xí)java技術(shù)的同學(xué),不妨報個Java培訓(xùn)班,有明確清晰的學(xué)習(xí)路線,理論知識+實戰(zhàn)操作,可以獲得快速提升。
想了解更多相關(guān)資訊請關(guān)注Java培訓(xùn)頻道-查看更多,了解相關(guān)專業(yè)課程信息您可在線咨詢也可免費申請試課。關(guān)注賦能網(wǎng)了解更多:4008-569-579
本文鏈接:
本文章“Java培訓(xùn):編寫GC高效代碼3個技巧”已幫助 96 人
免責(zé)聲明:本信息由用戶發(fā)布,本站不承擔(dān)本信息引起的任何交易及知識產(chǎn)權(quán)侵權(quán)的法律責(zé)任!
本文由賦能網(wǎng) 整理發(fā)布。了解更多培訓(xùn)機構(gòu)》培訓(xùn)課程》學(xué)習(xí)資訊》課程優(yōu)惠》課程開班》學(xué)校地址等機構(gòu)信息,可以留下您的聯(lián)系方式,讓課程老師跟你詳細(xì)解答:
咨詢熱線:4008-569-579