簡體   English   中英

java G1 gc 占用太多內存

[英]java G1 gc takes too much of memory

例如,我將 -Xmx 設置為 40G。 我希望我的 java 處理器不會使用超過 40G。

我的程序在 cms-gc 上運行良好。

但是當我用相同的內存(甚至多出 15% 的內存)更改為 G1 gc 時。

它總是被oom殺手殺死。

我發現了一些這樣的文章: 為什么我的 Java 進程比 Xmx 消耗更多的內存?

它表示:

 G1 is especially known for its 
 excessive appetite for additional memory, so be aware of this.

所以我想知道,如何限制 g1 gc 使用的內存以及為什么 g1 使用這么多額外的內存

您提到的文章( 為什么我的 Java 進程比 Xmx 消耗更多內存? )清楚地概述了它。

Java 進程需要內存用於以下幾件事:

  • Java 堆(又名內存分配池)
  • 應用程序中每個線程的堆棧
  • JVM 本身使用的內存(又名 permgen)
  • 本機函數(JRE 或第三方庫)分配的內存

另一個問題是一些JVM內存不計為永久內存,無法控制。

因此,如果要將 Java 應用程序限制為 40 GB,則必須考慮所有類型的內存。 從較小的值開始,例如:

-Xmx30g -XX:MaxPermSize=1g -Xss1m

然后觀察進程的內存使用情況,如果進程安全地遠離目標 40GB,則增加Xmx

您無法限制G1需要使用的內容。 如果可以的話 - 您會破壞所有內容或因堆內存不足錯誤而死亡,因為 G1 將沒有資源來正常運行。 要解釋為什么這個算法需要使用額外的內存,並不簡單。 它至少需要用於card tableremembered sets空間的內存, 這就是原因 它需要SATB隊列的內存,這些是一些數據結構,當GC周期處於活動狀態時“攔截”堆寫入和讀取。 我敢打賭還有更多。 一般來說,如果您想要並發(以便您的應用程序在 GC 周期處於活動狀態時運行),您需要提供更多內存。

暫無
暫無

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

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