2017-05-23 38 views
0

如果我有一個包含數十萬條目的多維數組,並且所有條目都是長期存在的類對象(即,只創建一次並且在應用程序的整個持續時間內存在),是否存在我需要的任何GC影響考慮?這會影響GC完成所花費的時間嗎?這會影響未來的分配/釋放嗎?擁有大量小類的GC含義是什麼?

對於上下文,我試圖在使用大量的類或大型數組結構之間作出決定。

+0

目前還不清楚你在問什麼 - 例如在考慮使用類與結構時,你們之間的爭論或困境是什麼?你正在談論未來的分配,但你說壽命是應用程序的持續時間,所以它不適用於陣列的未來重新分配。 – LB2

+0

@ LB2我的問題的主要特點是大量小類的GC含義。我提供的上下文只是您不需要的輔助信息。我通過分析發現,我的算法在大量的類而不是結構上工作得更好,並且希望確保我不會忽略某些東西。撥款聲明一般適用於新撥款;不是特定於大量類的特定類型。 – Slight

回答

1

如果這些小類很長壽,它們很快就會被提升爲Gen2對象,並且不會影響Gen0和Gen1的收集。它們不會影響分配。雖然它們會影響Gen2的收集,但是如果GC正在進行Gen2收集,那麼你就會遇到不同的問題。你的內存不足了。

除了影響GC,class vs struct會影響你的對象的內存佈局。這會影響CPU緩存的性能,這可能會對性能產生較大影響。

+0

這很有用,謝謝。到目前爲止,我通過分析發現,由於在我的用例中消除了結構體副本的開銷,大量的類往往運行速度提高了〜20%。我最擔心的是我沒有測量的隱藏的表演。在接受之前,請留下這個問題。 – Slight

1

Large Object Heap(LOH)中分配了足夠大的對象,該對象沒有以與常規堆分配相同的方式進行收集。 LOH中的對象不能正常壓縮,因此更容易結束內存碎片,因此,即使您的進程沒有使用大量內存,我也很有可能獲得OutOfMemoryException(我的經驗是700MB在處理大量大型對象時,在32位進程中很容易遇到這種情況)。

我問未來分配的原因是,如果這是您期望在程序中唯一的大對象,並且它不會與其他人一起重新分配,那麼擁有一個或幾個可能不是什麼大問題,不太可能會影響你太多。擁有大型數組或大型字符串等大型對象是可以的。如果需要LOH的分配足夠頻繁,那麼這可能是一個問題。

結構vs對象。對象顯然使數組的寬度與指針的大小相同 - 即32或64位。結構體可以存儲爲數組本身的值,所以如果結構體較大,那麼相同大小的元素數組將會更大的按字節順序排列。因此,較少數量的元素將導致將數組分配到LOH中。

+0

感謝您的信息,我發現它很有用。該陣列將被分配一次,永不再生,並永遠活着。 – Slight