在我的應用程序中,我需要將大文件(可以大約250MB)加載到內存中,我以懶惰的方式加載 - 當用戶要求查看文件時 - 我正在加載它。之後,每次用戶嘗試訪問該文件時,我都可以立即顯示它,因爲它已經位於內存中。 所以,問題是垃圾收集... 我加載的每個文件,我通過WeakReference加載, 但是: 我測試了幾次,我能夠加載大約3GB到內存中應用程序變得不可用),但GC沒有發生。我無法調用GC.Collect(2),因爲我無法確定調用它的時間,所以如何告訴GC在好時刻收集內存(弱引用)(該死的,3GB太多了......看起來好像GC只是不做他的工作) 熱點解決呢?我真的需要延遲加載,但是當進程使用超過1GB的內存時需要收集內存,或者類似的東西。LOH,WeakReferences,大型對象的垃圾回收
3
A
回答
1
有一個叫做GC.GetTotalMemory(bool forceFullCollection)
(http://msdn.microsoft.com/en-us/library/system.gc.gettotalmemory.aspx)的靜態函數。如果您已經通過了一些閾值,您可以在將新文件加載到內存之前使用它來強制垃圾收集。
編輯:一種可能實現
public MyFile GetMyFile(){
if (!is_my_file_in_memory()) {
if (CG.GetTotalMemory(false) > MY_THRESHOLD) {
GC.Collect(2);
}
load_my_file_in_memory();
}
return get_my_file_from_memory();
}
相關問題
- 1. python對象,垃圾回收
- 2. 有資格垃圾回收的對象
- 3. Ruby:標記垃圾回收的對象
- 4. JAVA中的多對象垃圾回收
- 5. 內部對象的垃圾回收
- 6. 因垃圾對象引用而導致的java垃圾回收
- 7. Java垃圾收集和大對象
- 8. Java短暫對象和垃圾回收
- 9. Android/Java對象沒有垃圾回收
- 10. Ruby類對象垃圾回收
- 11. 垃圾收集器如何決定何時殺死WeakReferences所持有的對象?
- 12. 垃圾收集對象
- 13. java垃圾回收
- 14. Java:垃圾回收
- 15. Python垃圾回收
- 16. C#垃圾回收
- 17. Erlang垃圾回收
- 18. java - 垃圾回收
- 19. JDBC垃圾回收
- 20. JS垃圾回收
- 21. requestAnimationFrame垃圾回收
- 22. vb.net垃圾回收
- 23. ColdFusion垃圾回收
- 24. PhoneGap垃圾回收
- 25. Chrome垃圾回收
- 26. Java:垃圾回收
- 27. Javascript垃圾回收
- 28. 垃圾收集:將對象收集
- 29. Android垃圾回收器,釋放對象內的對象
- 30. 查找C#垃圾回收器回收了多少個對象
我提到的,我不能確定那一刻,迫使垃圾收集......這不是一個文件被加載後,收集內存是一個好主意,會有絕對沒有延遲加載 – 2011-03-01 16:51:56
我提到你可以使用這個函數*之前*加載懶惰的文件到內存中:-) – linepogl 2011-03-01 16:55:47
GC.GetTotalMemory(true)在下次文件加載沒有幫助...我仍然能夠加載3GB進入內存,然後應用程序凍結 – 2011-03-01 17:04:28