簡體   English   中英

java內存中大小優化

[英]java in-memory size optimization

我正在編寫一些需要在內存中保存大量數據的“大數據”軟件。 我用c ++寫了一個非常好的原型。 然而,實際的最終用戶通常使用Java編寫代碼,因此他們要求我也編寫Java原型。

我已經完成了java中內存占用的背景閱讀和一些初步測試。 例如,假設我有這個對象

public class DataPoint{

    int cents, time, product_id, store_id;

    public DataPoint(int cents, int time, int product_id, int store_id){
    this.cents = cents;
    this.time = time;
    this.product_id = product_id;
    this.store_id = store_id;
    }
}

在C ++中,這個結構的大小是16個字節,這是有道理的。 在Java中,我們必須是間接的。 如果我創建了例如10m的這些對象並使用Runtime.totalMemory() - Runtime.freeMemory()之前和之后然后根據需要進行除法,每個結構大約需要36個字節。 一個~2.4倍的內存差異非常討厭; 當我們試圖在內存中保存數億個DataPoints時,它會變得丑陋。

我在某處看到,在Java中這樣的情況下,將數據存儲為數組更好 - 實質上是基於列的存儲而不是基於行的存儲。 我想我理解這一點:基於列的方式減少了引用數量,也許JVM甚至可以智能地將整數打包成8字節的字。

我可以使用哪些其他技巧來減少內存占用的內存占用內存塊,該內存塊具有一個非常大的維度(數百萬/數十億的數據點)和一個非常小的維度(O(1)列數/變量)?

結果是將數據存儲為4個int數組,每個條目恰好使用16個字節。 經驗教訓:小對象在java中具有令人討厭的比例開銷。

查看數據結構在Java中占用多少內存並不是那么簡單。 totalMemory()顯示為vm分配的空間,該空間大於實際使用情況。 您可以嘗試使用顯示數據結構空間消耗的Java分析器,它們很容易設置和運行。 一個方便的免費工具是Java自己的VisualVM ,例如顯示應用程序的內存行為,如果使用它,您還將學習Java的GC如何工作。

顯示性能足跡的VisualVM屏幕截圖(來自http://visualvm.java.net/features.html的圖片): 在此輸入圖像描述

如果可能的話,你還應該考慮讓變量最終。 它允許Java VM更好地優化代碼位(不確定它是否可以節省空間)。

首先, Java的對象總是比C++版本略大,因為該對象封裝了運行時類型信息,使您能夠執行C++無法實現的instanceof等。 此外,它還有助於您自己手動執行內存管理,因此您也可以將C++代碼的這一部分視為代碼庫的一部分。

您可以查看Flyweight模式以減少內存需求,以便重用DataPoints (使類為Immutable )。 我假設如果你有數十億的點,你說有些可能是相同的值。
我相信這里的其他人會提供一些關於內存空間優化的具體信息

根據值范圍,您可以使用較小的數據類型。 對於某些成員,你可以使用byte或short嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM