我知道很多人之前都问过这个问题,但我关注的不是性能,而是操作的内存占用。
考虑以下虚拟类:
public class MemoryDemo implements Runnable{
private boolean run;
public MemoryDemo(){
run = true;
}
@Override
public void run(){
byte[] wbuffer; //Here
final int n = ... //Some big quantity in order of millions.
while(run){
//byte[] wbuffer; or here?
wbuffer = new byte[n]; //Reallocate every loop? or just keep the same memory?
//Do stuff with the byte array here
//Copies the data to the target buffer (Not shown here, from another class)
System.arraycopy(wbuffer, 0, n, targetbuffer, 0, wbuffer.length);
}
}
}
我从这里和这里知道人们已经说过它在性能方面绝对没有区别,并且有限的范围是更好的方法,但是内存占用呢?
如果您从上面观察,您可以看到我正在分配一些非常大的数组,并且由于 java 没有删除函数/构造,我们必须依靠垃圾收集器来释放内存。在我的应用程序中,我有几个这样的循环(它基本上是一个实时图像处理管道),我希望尽可能地减少内存占用(即帮助 GC 以最好的方式完成它的工作)。
就垃圾收集而言,循环内部或循环声明(如果有)哪个更好?我知道 GC 只有在不再引用它时才能释放内存,但我不清楚如果你重新分配一个变量会发生什么(即当循环重新启动并且wbuffer
对象再次被分配时)。由于内部循环变量丢失了它的整个引用,它会首先被垃圾收集吗?或者当变量被重新分配时,它们是否都会被垃圾收集?我应该System.gc();
在每个循环结束时调用吗?
另外,如果我从不重新分配变量(因为我从不在循环中调用 new byte[n])假设我的代码可以写入字节数组中的所有字节,那么重新分配字节数组并不是一种更好的方法(更丑一个也...)?
注意 如果事实证明它确实是最好的选择,那么不重新分配数组对我(对于我的所有课程)来说可能不是一个可行的选择,还请解释哪个是第二好的(内部/外部循环或没有区别)!