Java中的低GC:使用原语而不是包装器
總覽
有兩個很好的理由在可能的地方使用原語而不是包裝器。
- 明晰。 通過使用原語,您可以清楚地知道null值是不合適的。
- 性能。 使用原語通常更快。
清晰度通常比性能更重要,并且是使用它們的最佳理由。 但是,本文討論了使用包裝程序?qū)π阅艿挠绊憽?
我對本文如何避免垃圾回收非常感興趣,但是缺少很多實際細(xì)節(jié)。 這是減少GC需求的系列文章中的第一篇。
使用包裝器的性能
以下微基準(zhǔn)的行為與許多應(yīng)用程序相同。
使用包裝器和包裝器集合循環(huán)
Map<Integer, Integer> counters = new HashMap<Integer, Integer>(); int runs = 20 * 1000; for (Integer i = 0; i < runs; i++) {Integer x = i % 12;Integer y = i / 12 % 12;Integer times = x * y;Integer count = counters.get(times);if (count == null)counters.put(times, 1);elsecounters.put(times, count + 1); }這將為每個任務(wù)創(chuàng)建對象。 雖然將int用作循環(huán)計數(shù)器是一種常見的做法,但是使用Iterator也是一種常見的做法。您可以使用此微基準(zhǔn)的類型和參數(shù),但是您會獲得許多嘗試過的開發(fā)人員熟悉的內(nèi)存配置文件調(diào)整他們的應(yīng)用程序。 使用VisualVM,在五分鐘的時間內(nèi),堆使用情況看起來像這樣。
大約6分鐘內(nèi)有20個次要GC。
每個循環(huán)的平均時間為亞微秒,非??臁?
每個循環(huán)消耗4,099 ns
每個回路占用559 ns
每個循環(huán)消耗115 ns 每個回路占用240 ns 每個回路占用255 ns 在第一個測試中,JVM尚未預(yù)熱。
使用原語真的可以帶來很大的不同嗎?
使用原語的性能
以下基準(zhǔn)測試與大多數(shù)應(yīng)用程序的行為截然不同。 即使它所做的工作與先前的基準(zhǔn)測試相同,也不會創(chuàng)建任何對象。
使用基元和數(shù)組循環(huán)
int[] counters = new int[144]; int runs = 20 * 1000; for (int i = 0; i < runs; i++) {int x = i % 12;int y = i / 12 % 12;int times = x * y;counters[times]++; }堆的使用情況反映了這一點
5分鐘內(nèi)沒有GC。 該測試可能運(yùn)行了更長的時間,但仍未觸發(fā)GC。
而且每個循環(huán)的平均時間也要短得多
每個循環(huán)198 ns
每個循環(huán)占用17 ns
每個循環(huán)占用16 ns 每個循環(huán)占用14 ns 每個循環(huán)占用15 ns
在第一個測試中,JVM尚未預(yù)熱。
結(jié)論
使用基元會更好。 (除非有過多的裝箱和拆箱)
即使在性能不是很關(guān)鍵的應(yīng)用程序中,它也可以提高代碼的清晰度,并且當(dāng)您嘗試對應(yīng)用程序進(jìn)行概要分析時,它也可以減少“噪聲”級別,從而使問題更清晰。
筆記
即使在很少創(chuàng)建對象的測試中,您也可以看到一些對象分配。 這主要是由于VisualVM的輪詢。 為了減少這種情況,我將輪詢間隔從3秒更改為20秒。
使用-XX:NewSize = 100m增加Eden大小以使圖形更清晰(不建議使用此值(也許除了微基準(zhǔn)測試)),但是它是您可能需要針對應(yīng)用程序進(jìn)行調(diào)整的參數(shù)。
完整代碼
- 原始基準(zhǔn)
- 包裝基準(zhǔn)
參考: Java中的低GC:使用原語,而不是來自Vanilla Java的 JCG合作伙伴 Peter Lawrey 的包裝 。 相關(guān)文章:
- 每個程序員都應(yīng)該知道的事情
- 正確記錄應(yīng)用程序的10個技巧
- 軟件設(shè)計法則
- Java最佳實踐系列
- 生存在狂野西部開發(fā)過程中的9條提示
- 如何在不到1ms的延遲內(nèi)完成100K TPS
- 提升您的休眠引擎
翻譯自: https://www.javacodegeeks.com/2011/07/low-gc-in-java-use-primitives-instead.html
總結(jié)
以上是生活随笔為你收集整理的Java中的低GC:使用原语而不是包装器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (跑胡子安卓)
- 下一篇: Java Secret:使用枚举构建状态