簡體   English   中英

如果未指定最大堆大小,則在 64 位系統上調用 java GC 時

[英]When java GC call on 64 bit system if max heap size not specified

我正在使用帶有 64GB RAM 的 64 位系統來處理大數據。 在處理數據時,我沒有提供任何堆最大大小參數。 我的程序不斷消耗內存,它沒有調用 java GC。 處理數據只需要 2GB 內存。 任何人都可以在 JVM 調用 GC 時提供詳細信息嗎? 還是必須提供堆最大大小參數?

我正在使用帶有 64GB RAM 的 64 位系統來處理大數據。 在處理數據時,我沒有提供任何堆最大大小參數。

在您的情況下,64 位 JVM 的默認堆大小是主內存的 1/4 或 16 GB。

我的程序不斷消耗內存,它沒有調用 java GC。

如果 GC 沒有運行,如果您根本不調整它而不管最大大小,我會感到非常驚訝。

處理數據只需要 2GB 內存。

你應該有次要的 GC 收集,除非你只使用大數組和很少的小對象。 即您的伊甸園空間永遠不會填滿。

任何人都可以在 JVM 調用 GC 時提供詳細信息嗎?

當達到當前 eden 大小時,它會執行次要 GC。 如果 GC 決定需要更多內存並且尚未達到最大值,它將增加可用堆。

還是必須提供堆最大大小參數?

僅當您希望它使用更少的內存時(但這可能會更慢)

如果要限制 JVM 使用的內存量,則需要提供 max heapsize 選項。 如果您不這樣做,JVM 將使用默認堆大小,它可能是可用 RAM 的一半(取決於您的 JVM 類型和版本)。

任何人都可以在 JVM 調用 GC 時提供詳細信息嗎?

當 JVM 認為有必要時調用它。 通常,那是 Eden 空間(創建大多數新對象的地方)太滿的時候。 如果您嘗試分配一個對於 Eden 空間來說太大的對象,並且該對象需要分配的永久空間太滿,也會發生這種情況。 實際決策取決於您的 JVM 使用的 GC 類型。 (而且它是不透明的;即沒有在任何已發布的文檔中指定/記錄。並且可能與您實際嘗試解決的問題無關。)

GC 沒有將最小化內存使用作為優化性能的主要目標。 相反,它將嘗試針對最小 GC 暫停時間進行優化,或者針對最大吞吐量進行優化。

因此,當 GC 運行時,JVM 不願意減小堆的大小。 這是因為如果堆大小明顯大於應用程序的可訪問對象的工作集,則 GC 往往會更有效地運行。

暫無
暫無

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

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