![](/img/trans.png)
[英]Impact of Java streams from GC perspective or handling short-lived objects by the GC
[英]how to optimize large short-lived objects in jvm gc
我們遇到了關於jvm gc的問題。 我們有一個大型的QPS應用程序,JVM堆內存的增加非常快。 它會在幾秒鍾內使用超過2g的堆內存,然后gc觸發器也會非常頻繁地每次收集超過2g的內存。GC收集下圖所示的情況。所以這有兩個問題
public static void fun1() {
for(int i = 0; i < 5000; i++) {
Byte[] bs = new Byte[1024 * 1024 * 5];
bs = null;
}
}
所以,我有一些問題:
任何建議都會對我有幫助。
我會說您需要緩存它們。 與其每次都重新創建它們,不如嘗試找到一種方法來重用已創建的它們。 嘗試使用選項為您的應用分配更多的內存
-Xms8g -Xmx8g
如果沒有足夠的內存,則會調用gc,因此,如果您有更多的gc,則不會經常調用它。
如果沒有大物體,很難提出有價值的建議。 嘗試添加此類對象的示例以及如何創建/調用它們。
如果短期對象內部有大字節數組,請嘗試將其放置在Java之外(例如,放在文件中並僅保留文件路徑)。
許多人說set對象等於null將使gc線程易於收集
這個問題在堆棧溢出中被其他幾個問題覆蓋,所以我在這里不再重復。 例如,當未使用的對象仍在堆棧中可見時,是否可用於垃圾回收?
如果存在大型短期對象,該如何優化? 我的意思是當年輕一代還不夠時,如何不收集這些對象。
增加年輕一代的規模。 這樣它就可以包含對象。 或者使用G1GC,它可以有選擇地收集包含此類對象的區域,而不是整個舊的對象。
您也可以嘗試使用直接字節緩沖區 ,該緩沖區將在堆外部分配內存,從而降低GC壓力。 但是內存將保持分配狀態,直到指向該內存的緩沖區被收集為止。
除此之外,您應該重新設計代碼,以避免如此頻繁的大量分配。 通常,人們可以使用對象池或線程局部變量作為暫存器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.