[英]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 進程需要內存用於以下幾件事:
另一個問題是一些JVM內存不計為永久內存,無法控制。
因此,如果要將 Java 應用程序限制為 40 GB,則必須考慮所有類型的內存。 從較小的值開始,例如:
-Xmx30g -XX:MaxPermSize=1g -Xss1m
然后觀察進程的內存使用情況,如果進程安全地遠離目標 40GB,則增加Xmx
。
您無法限制G1
需要使用的內容。 如果可以的話 - 您會破壞所有內容或因堆內存不足錯誤而死亡,因為 G1 將沒有資源來正常運行。 要解釋為什么這個算法需要使用額外的內存,並不簡單。 它至少需要用於card table
和remembered sets
空間的內存, 這就是原因。 它需要SATB
隊列的內存,這些是一些數據結構,當GC周期處於活動狀態時“攔截”堆寫入和讀取。 我敢打賭還有更多。 一般來說,如果您想要並發(以便您的應用程序在 GC 周期處於活動狀態時運行),您需要提供更多內存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.