我有一个长时间运行的线程,它会在很长一段时间内执行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仅在需要时清除内存(特别是来自旧代)。这些观察结果是否正确?
答案 0 :(得分:0)
999x999999大约是1000万双,每双8字节,每个分配8Gb。你肯定希望重用这么大的内存块,而不是在每次运行时将它丢给垃圾收集器。