簡體   English   中英

最大堆大小xmx如何影響Java中的內存分配/使用堆?

[英]How does maximum heap size xmx influence the memory allocation / used heap in Java?

如果我用-Xmx100000m (~100GB)執行一個巨大的模擬程序,我會看到使用堆中的一些尖峰(~30 GB)。 這種峰值會增加堆大小並減少其他程序可以使用的內存。 我想將堆大小限制為在沒有內存異常的情況下運行程序實際所需的大小。

在此輸入圖像描述

B.如果我用-Xmx10000 (~10GB)執行我的模擬程序,我可以限制使用的堆大小(~7 GB)。 總堆大小也是(當然)。 我在VisualVM數據中顯示的程序的第一階段(約16分鍾)內沒有內存異常。

在此輸入圖像描述

我天真地期望,如果我將xmx從10GB(B)增加到100GB(A),那么使用的堆將保持大致相同,並且Java只會使用更多內存以避免內存不足異常。 但是,行為似乎有所不同。 我想Java是以這種方式工作以提高性能。

對A中大量使用堆的解釋可能是,如果xmx較大,則哈希映射的增長行為會有所不同? xmx會對負載系數產生影響嗎?

在存在大量迷你尖峰的程序階段(參見例如B在12:06)而不是幾個大的尖峰(A)處理一些java流。 流處理的內存分配是否自動適應xmx值? (還剩下一些記憶,可以用來在B的12:06減少迷你尖峰)

如果沒有,A中使用較大堆的原因可能是什么?

如果可能的話,我如何告訴Java保持使用的堆低(如B的曲線),但如果發生內存不足異常(允許暫時切換到A)則需要占用更多內存。 這可以通過調整一些垃圾收集屬性來完成嗎?

編輯

如下面的答案所述,可以通過垃圾收集參數更改配置文件。 應用-Xmx100000m -XX:MaxGCPauseMillis = 1000從A調整配置文件以消耗更少的內存(使用約20 GB)和更多時間(約22分鍾)。

在此輸入圖像描述

我想將堆大小限制為在沒有內存異常的情況下運行程序實際所需的大小。

您實際上並不想這樣做,因為它會使您的程序極其緩慢,因為只提供與應用程序峰值占用量相當的數量意味着每個分配都會在應用程序接近最大值時觸發垃圾回收。

我想Java是以這種方式工作以提高性能。

確實。

JVM有幾個目標,按降序排列:

  • 暫停時間(延遲)
  • 分配吞吐量
  • 腳印

如果你想將足跡優先於其他目標,你必須放松其他目標。

暫無
暫無

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

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