我有一個應用程式,在空閑時間通常只需要 1GB 的 RAM,但是當我在 docker 內部啟動它時,它會從外部顯示更高的 RAM 使用率 (5GB)。JVM 指標顯示我仍然只使用 ~1GB 的 RAM,但 JVM 并沒有真正釋放它聲稱的任何 RAM。我無法減少 RAM 限制(使用 MaxRamPercentage 時約為 8GB),因為它在高負載、啟動和一些特殊事件期間需要它。我可以定期呼叫,System.gc()因為這會釋放和釋放大量記憶體,但是在幾次請求后,RAM 會回到原來的位置。這種聲稱未使用的 RAM 浪費了大量資源并導致服務器上的 OOM,因為沒有應用程式釋放它們的記憶體。
根據這個JEP-346,“錯誤”已被修復,導致垃圾收集器不釋放記憶體,但我沒有看到任何改進。
出于測驗目的,我也嘗試使用-XX: UseShenandoahGC并且它按預期釋放記憶體。但是在啟動期間它幾乎占用了所有 RAM,這在服務器/多個同時重啟應用程式期間會導致問題。
TLDR:實際使用 RAM ~1 GB,聲稱 RAM ~5 GB,RAM 限制 ~8GB。默認 GC 不會釋放足夠的 RAM,沒有顯式呼叫 System.gc()。G1 GC 是 Java 17 中的默認 GC 嗎?(確實如此)是否需要任何引數才能使JEP-346的更改按預期作業?
uj5u.com熱心網友回復:
我認為這與您要問的問題類似。
正如問題的評論中指出的那樣,此功能是可選的,可以使用JEP 346 檔案中描述的引數啟用。
雙方-XX:G1PeriodicGCInterval并-XX:G1PeriodicGCSystemLoadThreshold必須被設定為一個值大于默認為0的功能作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/369493.html
