簡體   English   中英

在 Java 中長時間運行的線程中聲明數組的最佳方法

[英]Best way to declare an array in a long running thread in Java

我有一個長時間運行的線程,它執行test()方法很長時間。 聲明和初始化data數組的最佳方法是什么(就內存和性能而言)? 如果data是一維數組呢?

選擇#1

public void test() {
    double[][] data;    //declare only

    while (true) {
        //initialize data here every time.
        data = new double[99][9999];

        //do some procesing with data
    }
}

選擇#2

public void test() {

    double[][] data = new double[99][9999];

    while (true) {
        //reset everything in data
        for (double[] row: data)
            Arrays.fill(row, 0.0);

        //do some procesing with data
    }
}

選擇#3 - 有什么建議嗎?

因為我認為選擇 #2 在記憶方面更好。 在選擇 #1 的情況下,在每次迭代中,它都會在堆上獲得一個新的分配,並且之前的分配有資格進行垃圾回收。 但是,之前的分配何時空閑取決於垃圾收集器(GC)。 有時,長數組分配可能不會發生在年輕代中。 在這種情況下,它將在內存中停留一段時間(直到完全 GC)。 因此,只要線程正在運行,內存使用量就可能會增加。 GC 只在需要時才清除內存(尤其是老年代)。 這些觀察是否正確?

999x999999 大約是 100 萬個雙精度數,每個雙精度數為 8 個字節,即每次分配 8Gb。 您肯定希望重用如此大的內存塊,而不是在每次運行時將其扔給垃圾收集器。

暫無
暫無

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

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