在Java中长时间运行的线程中声明数组的最佳方法

时间:2017-01-26 13:37:27

标签: java arrays multithreading garbage-collection

我有一个长时间运行的线程,它会在很长一段时间内执行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仅在需要时清除内存(特别是来自旧代)。这些观察结果是否正确?

1 个答案:

答案 0 :(得分:0)

999x999999大约是1000万双,每双8字节,每个分配8Gb。你肯定希望重用这么大的内存块,而不是在每次运行时将它丢给垃圾收集器。