在32位機器上,每個進程都獲得4GB的虛擬空間。在這種情況下,人們可能擔心我們可能會因分散而面臨麻煩。但是在64位機器的情況下,我們理論上具有巨大的可尋址虛擬內存,那麼爲什麼在64位機器中內存碎片仍然是問題(如果是)?爲什麼64位機器上的內存碎片問題?
回答
您嘗試訪問的每個虛擬地址都由操作系統映射到物理內存。物理內存以頁面分配(例如4K大小)。如果管理分配一個字節偏移量1000000 * n和做到這一點對於n從1到1000000(我想你可以做到這一點與MMAP),那麼操作系統將需要備份與物理百萬頁內存,這就像4G。該物理內存將不能用於其他任何事情。如果您連續分配了這些字節,那麼對於您的百萬字節,您只需要大約1M的物理內存(256頁)。
如果您爲合法原因分配4G,然後釋放其中的部分內容,保留每頁分配位置,您可能會遇到類似的不利情況。由於沒有完全免費的物理頁面,操作系統將無法真正重用已釋放的內存。所以這是一個分裂問題。
理論上,你可以想象虛擬地址1000000和2000000會映射到物理內存的同一頁面,避免了碎片。但在實踐中,出於很好的理由,虛擬內存映射是逐頁完成的。你可以在這裏閱讀更多關於它的信息:http://en.wikipedia.org/wiki/Page_table。
因爲所有的內存都是「浪費」的,所以考慮一個應用程序,其中有很多內部碎片。該過程需要更多的內存頁面,因爲工作集現在分散在內存中,這意味着其內存佔用量要高得多。如果這個應用程序爭用RAM中的物理插槽(對於典型的家庭設置,機器實際上只有大約4-8GB的RAM),那麼它會導致更多的頁面交換。一般而言,您希望減少應用程序內存佔用量,以避免內存壓力和與其他應用程序的爭用。
有些情況下,雖然它並不重要,但它不會殺死您在這裏或那裏使用額外的兆字節,但它會累積在更大的應用程序中。這取決於情況,根據你所編碼的內容或你的項目的目標是否有儘可能少的碎片是重要的。
但是「內存碎片」呢?對此的迴應應該可能涵蓋malloc,操作系統和硬件因素如何分配和映射虛擬內存...... – 2011-12-17 04:54:53
- 1. MongoDB ona 64位機器的節點/碎片限制是什麼?
- 2. 64位mongodb多個碎片問題
- 3. 安裝在64位機器上的Enthought Canopy的64位問題
- 4. XslCompiledTransform.Transform 64位內存問題
- 5. 碎片內存是什麼樣的?
- 6. 低內存系統上的64位和32位Ubuntu - 爲什麼Ubuntu 64位會吃我的內存?
- 7. APC緩存碎片問題
- 8. 爲什麼我的PowerShell主機在64位機器上以32位運行?
- 9. 內存碎片
- 10. 64位機內存分配
- 11. 問題RegConnectRegistry連接到64位機器
- 12. 在64位機器上調用64位Dephi DLL從C#在64位機器上
- 13. 64位土地中的堆碎片
- 14. 在64位機器上安裝Coldfusion 8 32位 - 任何問題?
- 15. 64位機器上的strtok
- 16. 爲什麼Redis中的內存碎片小於1
- 17. 在64位機器上的內存中的結構表示
- 18. 爲什麼使用碎片?
- 19. 內存泄漏,位圖,碎片
- 20. 試圖在64位機器上加載odbcad32的問題
- 21. 在64位機器上讀Windows密鑰的問題
- 22. Windows7 64位機器上的SQL Server 2008 R2安裝問題
- 23. cuda內存碎片
- 24. SharpDX內存碎片
- 25. 64位機器上的sizeof(int)應該是什麼?
- 26. android碎片問題
- 27. Android碎片問題
- 28. 與64位平臺上的大對象堆碎片相比,在.NET上是32位還是問題?
- 29. 系統在64位機器上出現內存異常?
- 30. 的Android - 適配器的碎片問題
這在64位操作系統上不是問題。 – 2011-12-17 09:55:30
不應該這個評論是答案嗎?現有的答案似乎暗示這是64位的問題 – paulm 2016-08-31 13:45:33