最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

GC調優(yōu)實戰(zhàn)之過早提升Premature?Promotion

 更新時間:2022年01月26日 08:34:05   作者:金色夢想  
這篇文章主要為大家介紹了GC調優(yōu)實戰(zhàn)之過早提升Premature?Promotion

過早提升(Premature Promotion)

提升速率(promotion rate), 用于衡量單位時間內從年輕代提升到老年代的數據量。一般使用 MB/sec 作為單位, 和分配速率類似。

JVM會將長時間存活的對象從年輕代提升到老年代。根據分代假設, 可能存在一種情況, 老年代中不僅有存活時間長的對象,也可能有存活時間短的對象。這就是過早提升:對象存活時間還不夠長的時候就被提升到了老年代。

major GC 不是為頻繁回收而設計的, 但 major GC 現(xiàn)在也要清理這些生命短暫的對象, 就會導致GC暫停時間過長。這會嚴重影響系統(tǒng)的吞吐量。

如何測量提升速率

可以指定JVM參數 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps , 通過GC日志來測量提升速率. JVM記錄的GC暫停信息如下所示:

0.291: [GC (Allocation Failure)
[PSYoungGen: 33280K->5088K(38400K)]
33280K->24360K(125952K), 0.0365286 secs]
[Times: user=0.11 sys=0.02, real=0.04 secs]
0.446: [GC (Allocation Failure)
[PSYoungGen: 38368K->5120K(71680K)]
57640K->46240K(159232K), 0.0456796 secs]
[Times: user=0.15 sys=0.02, real=0.04 secs]
0.829: [GC (Allocation Failure)
[PSYoungGen: 71680K->5120K(71680K)]
112800K->81912K(159232K), 0.0861795 secs]
[Times: user=0.23 sys=0.03, real=0.09 secs]

從上面的日志可以得知: GC之前和之后的 年輕代使用量以及堆內存使用量。這樣就可以通過差值算出老年代的使用量。GC日志中的信息可以表述為:

EventTimeYoung decreasedTotal decreasedPromotedPromotion rate
(事件)(耗時)(年輕代減少)(整個堆內存減少)(提升量)(提升速率)
1st GC291ms28,192K8,920K19,272K66.2 MB/sec
2nd GC446ms33,248K11,400K21,848K140.95 MB/sec
3rd GC829ms66,560K30,888K35,672K93.14 MB/sec
Total829ms  76,792K92.63 MB/sec

根據這些信息, 就可以計算出觀測周期內的提升速率。平均提升速率為 92 MB/秒, 峰值為 140.95 MB/秒。

請注意, 只能根據 minor GC 計算提升速率。 Full GC 的日志不能用于計算提升速率, 因為 major GC 會清理掉老年代中的一部分對象。

提升速率的意義

和分配速率一樣, 提升速率也會影響GC暫停的頻率。但分配速率主要影響 minor GC, 而提升速率則影響 major GC 的頻率。有大量的對象提升,自然很快將老年代填滿。 老年代填充的越快, 則 major GC 事件的頻率就會越高。

此前說過, full GC 通常需要更多的時間, 因為需要處理更多的對象, 還要執(zhí)行碎片整理等額外的復雜過程。

示例

讓我們看一個過早提升的示例。 這個程序創(chuàng)建/獲取大量的對象/數據,并暫存到集合之中, 達到一定數量后進行批處理:

public class PrematurePromotion {
private static final Collection<byte[]> accumulatedChunks
= new ArrayList<>();
private static void onNewChunk(byte[] bytes) {
accumulatedChunks.add(bytes);
if(accumulatedChunks.size() > MAX_CHUNKS) {
processBatch(accumulatedChunks);
accumulatedChunks.clear();
}
}
}

此 Demo 程序 受到過早提升的影響。下文將進行驗證并給出解決辦法。

過早提升的影響

一般來說,過早提升的癥狀表現(xiàn)為以下形式:

  • 短時間內頻繁地執(zhí)行 full GC。
  • 每次 full GC 后老年代的使用率都很低, 在10-20%或以下。
  • 提升速率接近于分配速率。

要演示這種情況稍微有點麻煩, 所以我們使用特殊手段, 讓對象提升到老年代的年齡比默認情況小很多。指定GC參數 -Xmx24m -XX:NewSize=16m -XX:MaxTenuringThreshold=1, 運行程序之后,可以看到下面的GC日志:

2.176: [Full GC (Ergonomics)
[PSYoungGen: 9216K->0K(10752K)]
[ParOldGen: 10020K->9042K(12288K)]
19236K->9042K(23040K), 0.0036840 secs]
2.394: [Full GC (Ergonomics)
[PSYoungGen: 9216K->0K(10752K)]
[ParOldGen: 9042K->8064K(12288K)]
18258K->8064K(23040K), 0.0032855 secs]
2.611: [Full GC (Ergonomics)
[PSYoungGen: 9216K->0K(10752K)]
[ParOldGen: 8064K->7085K(12288K)]
17280K->7085K(23040K), 0.0031675 secs]
2.817: [Full GC (Ergonomics)
[PSYoungGen: 9216K->0K(10752K)]
[ParOldGen: 7085K->6107K(12288K)]
16301K->6107K(23040K), 0.0030652 secs]

乍一看似乎不是過早提升的問題。事實上,在每次GC之后老年代的使用率似乎在減少。但反過來想, 要是沒有對象提升或者提升率很小, 也就不會看到這么多的 Full GC 了。

簡單解釋一下這里的GC行為: 有很多對象提升到老年代, 同時老年代中也有很多對象被回收了, 這就造成了老年代使用量減少的假象. 但事實是大量的對象不斷地被提升到老年代, 并觸發(fā) full GC。

解決方案

簡單來說, 要解決這類問題, 需要讓年輕代存放得下暫存的數據。有兩種簡單的方法:

一是增加年輕代的大小, 設置JVM啟動參數, 類似這樣: -Xmx64m -XX:NewSize=32m, 程序在執(zhí)行時, Full GC 的次數自然會減少很多, 只會對 minor GC的持續(xù)時間產生影響:

2.251: [GC (Allocation Failure)
[PSYoungGen: 28672K->3872K(28672K)]
37126K->12358K(61440K), 0.0008543 secs]
2.776: [GC (Allocation Failure)
[PSYoungGen: 28448K->4096K(28672K)]
36934K->16974K(61440K), 0.0033022 secs]

二是減少每次批處理的數量, 也能得到類似的結果. 至于選用哪個方案, 要根據業(yè)務需求決定。在某些情況下, 業(yè)務邏輯不允許減少批處理的數量, 那就只能增加堆內存,或者重新指定年輕代的大小。

如果都不可行, 就只能優(yōu)化數據結構, 減少內存消耗。但總體目標依然是一致的: 讓臨時數據能夠在年輕代存放得下。

以上就是GC調優(yōu)實戰(zhàn)之過早提升Premature Promotion的詳細內容,更多關于GC調優(yōu)過早提升的資料請關注腳本之家其它相關文章!

原文鏈接:https://plumbr.io/handbook/gc-tuning-in-practice#premature-promotion

相關文章

  • Maven依賴爆紅的幾種解決思路

    Maven依賴爆紅的幾種解決思路

    本文介紹了多種解決Maven依賴爆紅的方法,包括刪除.lastupdate文件、更改鏡像設置、配置私服、刪除錯誤依賴、手動修改依賴和檢查pom文件錯誤等,通過這些方法可以有效解決Maven項目中遇到的依賴問題,感興趣的可以了解一下
    2024-10-10
  • 深入理解java代碼實現(xiàn)分治算法

    深入理解java代碼實現(xiàn)分治算法

    分治算法是一種遞歸算法,它將問題劃分為幾個獨立的子問題,然后遞歸地解決這些子問題,最后將子問題的解合并起來得到原問題的解,本文詳細的介紹java分治算法,感興趣的可以了解一下
    2023-09-09
  • Java的Spring?AOP詳細講解

    Java的Spring?AOP詳細講解

    章主要為大家詳細介紹了Java的Spring?AOP,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • Java中的包裝類是什么

    Java中的包裝類是什么

    這篇文章主要介紹了Java中的包裝類是什么,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java中LinkedHashSet、LinkedHashMap源碼詳解

    Java中LinkedHashSet、LinkedHashMap源碼詳解

    這篇文章主要介紹了Java中LinkedHashSet、LinkedHashMap源碼詳解,LinkedHashMap是一個以雙向鏈表的方式將Entry節(jié)點鏈接起來的HashMap子類,它在HashMap的基礎上實現(xiàn)了更多的功能,具有順序存儲和遍歷的特性,需要的朋友可以參考下
    2023-09-09
  • Java Clone(類的復制)實例代碼

    Java Clone(類的復制)實例代碼

    Java Clone(類的復制)實例代碼,需要的朋友可以參考一下
    2013-03-03
  • ElasticSearch整合SpringBoot搭建配置

    ElasticSearch整合SpringBoot搭建配置

    這篇文章主要為大家介紹了ElasticSearch整合SpringBoot搭建配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • ThreadLocal內存泄露的產生原因和處理方法

    ThreadLocal內存泄露的產生原因和處理方法

    ThreadLocal 的內存泄漏問題通常發(fā)生在使用 ThreadLocal 存儲對象時,尤其是在多線程環(huán)境中,線程池中的線程復用可能導致一些資源沒有及時清理,從而引發(fā)內存泄漏,所以本文給大家介紹了ThreadLocal內存泄露的產生原因和處理方法,需要的朋友可以參考下
    2024-12-12
  • java通過信號量實現(xiàn)限流的示例

    java通過信號量實現(xiàn)限流的示例

    本文主要介紹了java通過信號量實現(xiàn)限流的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • 基于jni調用時,jvm報錯問題的深入分析

    基于jni調用時,jvm報錯問題的深入分析

    本篇文章是對jni調用時,jvm的報錯問題進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05

最新評論

华坪县| 泽普县| 阿克苏市| 镇平县| 大英县| 鄂托克旗| 博野县| 平罗县| 汤原县| 龙口市| 襄垣县| 北票市| 五原县| 墨脱县| 拉萨市| 东辽县| 厦门市| 泰顺县| 同江市| 射洪县| 准格尔旗| 玛沁县| 淮安市| 合肥市| 金堂县| 鄂伦春自治旗| 洞口县| 余江县| 固安县| 宁强县| 忻城县| 罗源县| 惠东县| 灯塔市| 宁津县| 珲春市| 日照市| 运城市| 德阳市| 麻江县| 柘荣县|