arraylist内存溢出_ArrayList使用内存映射文件
arraylist內存溢出
介紹
內存中的計算由于負擔得起的硬件而開始興起,大多數數據保留在RAM中以滿足延遲和吞吐量的目標,但是將數據保留在RAM中會增加垃圾收集器的開銷,尤其是在您不預先分配內存的情況下。 因此,有效地我們需要一種無垃圾/無垃圾的方法來避免GC打ic
無垃圾/無垃圾數據結構
有幾種選擇可以實現它
對象池
對象池模式是一個很好的解決方案,我在Lock Less Object Pool博客中寫道
堆外對象
JVM對創建脫機對象具有很好的支持。 如果您走這條高速公路,并且高速公路有其自身的風險,您可以擺脫GC暫停!
就像世界上最好的一樣,這是堆與堆的混合。
內存映射文件將允許映射內存中的部分數據,并且該內存將由OS管理,因此它將在正在映射文件的JVM進程中創建非常少的內存開銷。 這可以幫助以無垃圾方式管理數據,并且您可以讓JVM管理大型數據。 內存映射文件可用于開發IPC,我在Power-of-java-memorymapped-file博客中寫道。 在此博客中,我將創建由MemoryMapped File備份的ArrayList,此陣列列表可以存儲數百萬個對象,幾乎沒有GC開銷。 聽起來很瘋狂,但有可能。
讓我們行動起來
在此測試中,我使用具有以下屬性的Instrument對象
–整數ID
–雙倍價格
因此,每個對象都是12個字節。 這個新的數組列表包含1000萬個對象,我將嘗試評估寫入器/讀取器的性能
作家表現
X軸 –沒有讀數
Y軸 –以毫秒為單位增加一千萬的時間
添加1000萬個元素大約需要70毫秒,這非常快。
作家吞吐量
讓我們看一下性能的另一個方面,即吞吐量:
X軸 –沒有讀數
Y軸 –吞吐量/秒,百萬
作家吞吐量令人印象深刻,我的范圍介于1.38億到1.42億之間
讀者表現
X軸 –沒有讀數
Y軸 –讀取1000萬以毫秒為單位的時間
讀取1000萬條記錄大約需要44毫秒,非常快。 憑借這種性能,您肯定會挑戰數據庫。
讀者吞吐量
X軸 –沒有讀數
Y軸 –吞吐量/秒,百萬
哇吞吐量很棒,每秒220+百萬
以1.38億/秒的寫入器吞吐率和2.2億/秒的讀取器吞吐率看似非常有前途。
與數組列表比較
讓我們比較BigArrayList和ArrayList的性能,
作家吞吐量– BigArrayList與ArrayList
BigArrayList的吞吐量幾乎恒定在1.38億/秒左右, ArrayList以5000萬 /秒開始,跌落到500萬以下。
ArrayList有很多問題,這是由于
–陣列分配
–陣列復制
–垃圾收集開銷
在這種情況下, BigArrayList是贏家,它比arraylist快7倍 。
讀取器吞吐量– BigArrayList與ArrayList
ArrayList的性能比BigArrayList更好,大約快1倍。
在這種情況下,BigArrayList速度較慢,因為
–隨著請求更多數據,它必須將映射文件保留在內存中
–取消封送的成本
BigArrayList的讀取器吞吐量為220+百萬/秒,仍然非常快,只有很少的應用程序想要比這更快的處理消息。
因此,對于大多數用例來說,這應該可行。
使用以下技術可以提高閱讀器性能
–從映射的流中批量讀取消息
–通過使用索引來預取消息,就像CPU一樣
通過進行上述更改,我們可以將性能提高幾百萬美元,但是我認為,在大多數情況下,當前的性能還是不錯的
結論
內存映射文件是值得研究的領域,它可以解決許多性能問題。 Java現在正被用于開發交易應用程序,GC從一開始就是您必須回答的一個問題,您需要找到一種使GC保持快樂的方法,而MemoryMapped是GC會喜歡的一件事。
該博客使用的代碼可在@GitHub上獲得 ,我使用2gb內存進行了測試。 代碼不能處理某些極端情況,但足以證明MemoryMapped文件在許多情況下都能勝出。
翻譯自: https://www.javacodegeeks.com/2013/07/arraylist-using-memory-mapped-file.html
arraylist內存溢出
總結
以上是生活随笔為你收集整理的arraylist内存溢出_ArrayList使用内存映射文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果或2023年推出折叠iphone(2
- 下一篇: 外星人台式电脑显卡型号(外星人台式机的显