2011-10-17 37 views
4

我正在考慮對大量的TimerTasks(比如說一兩百萬)使用Timer類。 Timer的堆實現是基於數組的,並且由於沒有辦法爲數組保留空間,所以問題出現了,當內存碎片時,Java如何處理大型連續內存塊(對於這種情況下的數組)的分配?Java內存碎片和大型數組的分配

如果沒有可用的片段足夠大,是否會拋出OutOfMemoryError?或者,當可用內存總量足夠時,我可以期待JVM具有某種內存解除碎片策略嗎?

編輯:看來沒有JVM實現獨立的答案我的問題。在我的情況下,JVM實現是OpenJDK 14.0-b16版(根據java.vm.name和java.vm.version系統屬性)。

回答

3

首先,這不是由Java語言規範定義的,因此您將得到的具體答案將取決於實現。我甚至不相信它是在虛擬機規範中定義的。

事實上,我建議您將您的問題縮小到特定的JVM實現

如果沒有可用的片段足夠大,會不會總是拋出OutOfMemoryError?或者,當可用內存總量足夠時,我可以期待JVM具有某種內存解除碎片策略嗎?

由於Java隱藏了實際的存儲器地址也可以隨意進行memory compaction。所以是的,你可以期望它有內存碎片整理策略。 (請記住,您的操作系統可能爲JVM提供了虛擬內存,因此您的應用程序和物理地址之間還有一層。)