日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java中的低GC:使用原语而不是包装器

發(fā)布時間:2023/12/3 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中的低GC:使用原语而不是包装器 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

總覽
有兩個很好的理由在可能的地方使用原語而不是包裝器。

  • 明晰。 通過使用原語,您可以清楚地知道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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。