![](/img/trans.png)
[英]What is the best way of converting List<Long> object to long[] array in 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.