内存heap_哪个内存更快?Heap或ByteBuffer或Direct?
內存heap
 Java正在成為新的C / C ++,它被廣泛用于開發高性能系統。 對像我這樣的數百萬Java開發人員來說非常好! 
 在這個博客中,我將分享我可以用Java完成的不同類型的內存分配的實驗,以及從中獲得什么好處。 
Java中的內存分配
Java為內存分配提供哪種類型的支持:
–堆內存
我不必解釋這一點,所有Java應用程序都以此開頭。 使用“ new”關鍵字分配的所有對象都在“堆內存”下
–非直接字節緩沖區
 它是字節數組的包裝,只是堆內存的味道。 
 ByteBuffer.allocate()可用于創建這種類型的對象,如果要處理字節而不是對象,則非常有用。 
–直接字節緩沖區
 這是Java自JDK 1.4起添加的真實內容。 
 基于Java Doc的Direct ByteBuffer的描述 
“可以通過調用此類的allocateDirect工廠方法來創建直接字節緩沖區。 這種方法返回的緩沖區通常比非直接緩沖區具有更高的分配和釋放成本。 直接緩沖區的內容可能駐留在普通垃圾回收堆的外部,因此它們對應用程序內存占用的影響可能并不明顯。 因此,建議直接緩沖區主要分配給大型,壽命長的緩沖區,這些緩沖區要受基礎系統的本機I / O操作的約束。 通常,最好僅在直接緩沖區產生可觀的程序性能提升時才分配它們。”
關于直接緩沖區要注意的重要事項是
- 它在JVM之外
- 遠離垃圾收集器。
 如果您關心性能,這些都是非常重要的事情。 
 MemoryMapped文件也具有Direct字節緩沖區的風格,我在以下博客中與我分享了一些發現: 
- arraylist使用內存映射文件
- Java記憶符號文件的功能
堆或直接內存
這幾乎與Direct ByteBuffer相同,但是幾乎沒有什么不同,它可以由unsafe.allocateMemory分配,因為它是直接內存,因此不會產生GC開銷。 這種類型的內存必須手動釋放。
從理論上講,不允許Java程序員進行這種分配,我認為原因可能是
- 操作這種類型的內存很復雜,因為您只處理字節而不是對象
- C / C ++社區不會喜歡它
讓我們深入研究內存分配
對于內存分配測試,我將使用13字節的消息,并將其分解為
- int – 4字節
- 長– 8字節
- 字節– 1字節
我只會測試寫入/讀取性能,而不會測試內存消耗/分配速度。
寫性能
X軸 –沒有讀數
 Y軸 -運算/秒(百萬) 
使用4種分配類型寫入500萬個13字節對象。 
 我對5000萬個對象進行了相同的測試,以檢查其縮放比例,以下是相同的圖形。 
  
 X軸 –沒有讀數 Y軸 -運算/秒(百萬) 數字幾乎等于500萬。 
閱讀表現
 讓我們看一下閱讀性能 
  
 X軸 –沒有讀數 Y軸 -運算/秒(百萬) 這個數字很有趣,OFF堆正在為12,000 Mills / Sec快速吞吐。 HEAP讀取僅接近一次,比OFF Heap慢6倍左右。 看一下Direct ByteBuffer,它的傳輸速度僅為4億/秒,不知道為什么會這樣。 
 讓我們看看5000萬個對象的數量 
  
 X軸 –沒有讀數 Y軸 -運算/秒(百萬) 沒有太大的不同。 
結論
 通過Unsafe進行的堆外業務以330/11200百萬/秒的速度快速燃燒。 
 所有其他類型的分配的性能對讀取或寫入均有利,而所有分配均不適用于兩者。 
 關于ByteBuffer的特別說明,可悲的是,我確定看到這樣的數字后您將不會使用它。 DirectBytebuffer的讀取速度很慢,我不確定為什么它這么慢。 
因此,如果內存讀/寫正在成為您系統中的瓶頸,那么肯定要走“堆外”方式,請記住這是高速公路,因此請謹慎駕駛。
代碼可用@ git hub
參考: 哪個內存更快Heap或ByteBuffer或Direct? 來自我們JCG合作伙伴 Ashkrit Sharma的“您準備好了嗎”博客。翻譯自: https://www.javacodegeeks.com/2013/08/which-memory-is-faster-heap-or-bytebuffer-or-direct.html
內存heap
總結
以上是生活随笔為你收集整理的内存heap_哪个内存更快?Heap或ByteBuffer或Direct?的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 世界上最稀有的蛇(珍稀罕见的白化眼镜蛇简
- 下一篇: 画世界APP如何绘图 画世界APP绘图方
