分割資料堆 (僅限 Windows ,已淘汰)
許多 Java™ 應用程式工作量取決於 Java 資料堆大小。 SDK 可以使用分割資料堆來暫行解決 32 位元 Windows 記憶體空間中的限制,並提供較大的資料堆大小上限。 對於必須在 32 位元 JVM 上執行 (例如,因為 32 位元 JNI 程式庫、32 位元作業系統或 32 位元硬體) 但需要大型 Java 資料堆的應用程式而言,此特性非常有用。
附註: -Xgc:splitheap 指令行選項在第 8 版中已淘汰,將從未來版本的 IBM SDK 中移除。
Windows 位址空間中的岔斷會將 Java 資料堆限制為小於 2 GB。 使用分割資料堆,可讓 Java 資料堆存在於位址空間中岔斷的兩端。 與使用一個連續記憶體區域相比,您可能可以配置更大的資料堆。 透過使用較大的資料堆,您可以在發生記憶體回收之前配置更多物件,並且可以在發生 OutOfMemoryError 異常狀況之前增加您可以使用的存活物件數目。
使用 -Xgc:splitheap 指令行選項 (僅適用於 Windows 32 位元 JVM) 來啟用分割資料堆。 當您使用這個選項時,也會啟用下列行為:
- 會強制記憶體回收器使用 gencon (世代並行) 記憶體回收原則。
- 世代 Java 資料堆的新舊區域會配置在個別的記憶體區域中。
- 已停用重新調整新舊記憶體區域的大小。
如果您的應用程式以下列任何方式運作,則不建議使用分割資料堆:
- 在 gencon 記憶體回收原則下執行效能不佳。
- 載入大量類別。
- 在 JNI 程式庫中使用大量原生系統記憶體; 增加的大小 Java 資料堆可能會保留太多應用程式位址空間。
限制: 除非在 boot.ini 檔案中指定 /3GB 選項,否則 Windows 32 位元處理程序限制為 2 GB 位址空間。 如需相關資訊,請參閱 SDK 使用手冊 中的 Windows 32 位元大型位址察覺支援 。
使用分割資料堆,舊區域會在較低記憶體區域中確定其大小上限 (使用 -Xmox設定) ,而新區域會在較高記憶體區域中確定其大小上限 (使用 -Xmnx設定)。
配置失敗
使用分割資料堆時, JVM 在啟動時可能會以更多方式失敗。 下列訊息是配置分割資料堆失敗所導致:
- JVMJ9GC064 無法配置舊空間
- 較低記憶體中沒有足夠的可用空間來配置舊區域。 若要解決問題,請減少 -Xmox。
- JVMJ9GC065 無法配置新的空間
- 更高記憶體中沒有足夠的可用空間來配置新區域。 若要解決問題,請減少 -Xmnx。
- JVMJ9GC066 無法配置必要的分割資料堆記憶體幾何佈置
- 新區域的分配低於舊區域。 若要解決問題,請減少 -Xmx。
資料堆大小上限
一般資料堆大小上限如下:
- 使用 32–bit JVM 之 32 位元硬體上的 Windows 7 32 位元
- 1800 MiB 舊區域和 1000 MiB 新區域。
-Xgc:splitheap -Xmx2800m -Xmox1800m - 64 位元硬體上使用 32–bit JVM 的 Windows 7 64 位元
- 1700 MiB 舊區域及 2000 MiB 新區域。
-Xgc:splitheap -Xmx3700m -Xmox1700m
如果應用程式載入大量類別、載入大量原生程式庫或啟動數個執行緒,則應用程式會有較低的限制。