簡體   English   中英

如何在jvm gc中優化大型短期對象

[英]how to optimize large short-lived objects in jvm gc

我們遇到了關於jvm gc的問題。 我們有一個大型的QPS應用程序,JVM堆內存的增加非常快。 它會在幾秒鍾內使用超過2g的堆內存,然后gc觸發器也會非常頻繁地每次收集超過2g的內存。GC收集下圖所示的情況。所以這有兩個問題

  1. gc需要一些時間。 更重要的是,它很頻繁。
  2. 系統將無法穩定。

在此處輸入圖片說明 我像下面的代碼一樣抽象問題。 系統快速分配短期對象。

public static void fun1() {
    for(int i = 0; i < 5000; i++) {
        Byte[] bs = new Byte[1024 * 1024 * 5];
        bs = null;
    }
}

所以,我有一些問題:

  1. 許多人說set對象等於null會讓gc線程容易收集。這意味着什么? 我們都知道,當JVM無法為新對象分配空間時,總是會觸發次要GC。
    為null,只有在空間不足時才會觸發gc。 所以set object為null毫無意義。
  2. 如果存在大型短期對象,該如何優化? 我的意思是當年輕一代還不夠時,如何不收集這些對象。

任何建議都會對我有幫助。

我會說您需要緩存它們。 與其每次都重新創建它們,不如嘗試找到一種方法來重用已創建的它們。 嘗試使用選項為您的應用分配更多的內存

-Xms8g -Xmx8g

如果沒有足夠的內存,則會調用gc,因此,如果您有更多的gc,則不會經常調用它。

如果沒有大物體,很難提出有價值的建議。 嘗試添加此類對象的示例以及如何創建/調用它們。

如果短期對象內部有大字節數組,請嘗試將其放置在Java之外(例如,放在文件中並僅保留文件路徑)。

許多人說set對象等於null將使gc線程易於收集

這個問題在堆棧溢出中被其他幾個問題覆蓋,所以我在這里不再重復。 例如,當未使用的對象仍在堆棧中可見時,是否可用於垃圾回收?

如果存在大型短期對象,該如何優化? 我的意思是當年輕一代還不夠時,如何不收集這些對象。

增加年輕一代的規模。 這樣它就可以包含對象。 或者使用G1GC,它可以有選擇地收集包含此類對象的區域,而不是整個舊的對象。

您也可以嘗試使用直接字節緩沖區 ,該緩沖區將在堆外部分配內存,從而降低GC壓力。 但是內存將保持分配狀態,直到指向該內存的緩沖區被收集為止。

除此之外,您應該重新設計代碼,以避免如此頻繁的大量分配。 通常,人們可以使用對象池或線程局部變量作為暫存器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM