不完全知道如何短語的稱號,但問題是:如何實現內存堆
我在節目開始聽到程序員分配的連續內存的一大段,然後在必要時處理它。這與每次需要內存時簡單地進入操作系統形成對比。 我聽說這樣做會更快,因爲它可以避免不斷向操作系統請求連續內存塊的成本。
我相信JVM只是這樣做,維護自己的內存部分,然後從中分配對象。
我的問題是,如何實際執行此?
感謝, dragonwrenn
不完全知道如何短語的稱號,但問題是:如何實現內存堆
我在節目開始聽到程序員分配的連續內存的一大段,然後在必要時處理它。這與每次需要內存時簡單地進入操作系統形成對比。 我聽說這樣做會更快,因爲它可以避免不斷向操作系統請求連續內存塊的成本。
我相信JVM只是這樣做,維護自己的內存部分,然後從中分配對象。
我的問題是,如何實際執行此?
感謝, dragonwrenn
大多數C和C++編譯器已經提供了堆內存管理器作爲標準庫的一部分,因此您不需要執行任何操作,以避免每次請求都觸發操作系統。
如果你想提高性能,有很多改進的分配器,你可以簡單地鏈接和去。例如Hoard,小麥在現在被刪除的答案中提到了(實際上它很不錯 - 小麥,爲什麼你刪除它?)。
如果你想編寫自己的堆管理器作爲一個學習鍛鍊,這裏有它需要做的基本的東西:
@Ziezi:謝謝你指出,現在修好了。 – 2017-05-28 19:49:09
你在程序足夠大,以維持其需要的開始分配的內存塊。然後你必須覆蓋新的和/或malloc,刪除和/或自由地將內存返回到這個緩衝區。
在實現這種解決方案時,您需要編寫自己的分配器(來自塊的源),並且最終可能會使用多個分配器,這通常是爲什麼您首先分配內存池的原因。
默認的內存分配器是一個很好的全分配器,但不是所有分配需求的最佳選擇。例如,如果您知道您將爲特定大小分配大量對象,則可以定義一個分配器來分配固定大小的緩衝區,並預分配多個對象以獲得某種效率。
這裏是典型的分配,以及最好的非多線程應用之一:
http://g.oswego.edu/dl/html/malloc.html
您可以從閱讀其設計的解釋學到很多東西。這樣說,除非你的程序有非常不尋常的分配模式,否則編寫你自己的分配器或使用自定義的分配器可能是一個非常糟糕的主意。特別是如果您嘗試更換系統malloc
,則可能會將來自不同庫(或標準庫函數)的各種錯誤和兼容性問題鏈接到「malloc
的錯誤版本」。
如果您發現自己需要針對少數特定任務進行專門分配,則無需替換malloc
即可完成。我會建議查找GNU obstack
和固定尺寸對象的對象池。這些涉及大多數專門分配可能具有實際實際用處的情況。
斷章取義 - 你在SO上的參考文獻太好了。我一直想知道如何把它們作爲記憶來記住所有有限的事情:-(。 – 2010-12-21 06:47:50
IBM developerWorks的具有內存管理一個很好的文章,用廣泛的資源部分供進一步閱讀:Inside memory management。
維基百科也有一些很好的信息:C dynamic memory allocation,Memory management。
「去操作系統」是什麼意思?堆完全以用戶模式實現,並且每個堆分配都不需要系統調用,除非需要分配更多頁。或者你在想什麼不一樣的東西? – wj32 2010-12-21 04:32:10
「我如何實現內存管理器」這個問題很好,但你必須確保你真的需要這個。如果你是爲了訓練或者只是爲了好玩 - 好吧。如果您確定內存分配是您程序中的瓶頸,那麼您應該首先考慮重新設計程序,以便分配更大的塊。只有在你做完這些之後,你才能找到自己的內存管理器。 – sharptooth 2010-12-21 07:05:34