繁体   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