[英]explanation for Garbage Collector - Allocation Failure
我目前正在調查《我的世界》游戲中的性能錯誤( 原始帖子 )。 我需要檢查的最后一件事是垃圾收集器的輸出。 當我這樣做時,我注意到所有輸出的99%是[GC (Allocation Failure)....
這是輸出的一小部分示例:
13.238: [GC (Allocation Failure) 805728K->167001K(1601024K), 0.0251328 secs]
13.907: [GC (Allocation Failure) 805977K->167208K(1618432K), 0.0257168 secs]
14.559: [GC (Allocation Failure) 802088K->167520K(1597440K), 0.0262393 secs]
15.257: [GC (Allocation Failure) 802400K->168597K(1622016K), 0.0281692 secs]
15.925: [GC (Allocation Failure) 805525K->170531K(1618944K), 0.0202619 secs]
27.474: [GC (Allocation Failure) 807459K->178239K(1626624K), 0.0239986 secs]
27.884: [GC (System.gc()) 215249K->179128K(1624576K), 0.0286153 secs]
27.913: [Full GC (System.gc()) 179128K->167443K(1624576K), 0.4367059 secs]
作為一個問題建議,我將嘗試用嬰兒語言重新解釋Java GC(分配失敗)的答案。
JVM始終在堆中維護大量的空閑內存以用於新分配。
通常,當您執行new Something()
,一部分內存將從該空閑內存塊中剔除。 那是正常分配。
但是,最終空閑塊耗盡了,下一次嘗試插入一些內存的嘗試將失敗,即allocation failure
。
這是垃圾回收開始的信號。垃圾回收發揮其魔力,發現死亡的物體,將回收的內存壓縮為較大的空閑塊,並繼續循環。
換句話說, allocation failure
-對於JVM來說是完全正常的情況。
實際上,事情要稍微復雜一些。 堆有兩個部分(年輕空間和舊空間),線程本地分配緩沖區等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.