我正在处理我的应用程序中的大型数组,需要调整它们的大小.
假设您有一个2Gb的数组,并且您希望将其调整为3Gb.有没有办法在不需要暂时5Gb的情况下调整大小?
例如,给定使用-Xmx1G标志的1Gb堆:
public class Biggy {
public static void main(String[] args) {
int[] array;
array = new int[100 * 1000 * 1000]; // needs 400Mb, works
array = null; // needed for GC
array = new int[150 * 1000 * 1000]; // needs 600Mb, works
array = null; // needed for GC
array = new int[100 * 1000 * 1000]; // needs 400Mb, works
array = Arrays.copyOf(array, 150 * 1000 * 1000); // needs 1000Mb, throws out of memory
}
}
那么,有没有办法调整数组大小而不需要额外的临时内存?
解决方法:
我会使用List< int []>其中每个int []是固定大小.例如1.28亿.增长整个“集合”只涉及添加另一个数组.我在直接内存中使用IntBuffer,这避免了使用堆的需要. (或使用内存映射文件,这意味着它不使用堆或直接内存;)这是丑陋的,我使用包装类来隐藏丑陋.它确实表现得非常好.使用内存映射文件,我可以使用大于物理内存的“数组”.
private final List array = new ArrayList();
public int get(long n) {
return array.get((int)(n >> 27)).get(n & ((1 << 27) -1));
}
public void put(long n, int v) {
return array.get((int)(n >> 27)).put(n & ((1 << 27) -1), v);
}
标签:java,arrays,memory
来源: https://codeday.me/bug/20190630/1337380.html