等待很長一段時間我的代碼執行和它的指向我這個方法GC開銷超出限制 - 陣列
public Iterable<Board> neighbors() {
Queue<Board> q = new LinkedList<>();
int n = dimension();
int x = 0, y = 0;
outer:
// do some stuff to get the x and y
if (y+1 < n) {
the line where i get the error -> int [][]arr = new int[n][n];
for (int i = 0; i < tiles.length; i++) {
arr[i] = Arrays.copyOf(tiles[i], n);
}
// do some stuff
Board br = new Board(arr);
if(!this.equals(br)) {
q.add(new Board(arr));
}
}
if (y-1 >= 0) {
int [][]arr = new int[n][n];
for (int i = 0; i < tiles.length; i++) {
arr[i] = Arrays.copyOf(tiles[i], n);
}
// do some stuff
Board br = new Board(arr);
if(!this.equals(br)) {
q.add(new Board(arr));
}
}
if (x-1 >= 0) {
int [][]arr = new int[n][n];
for (int i = 0; i < tiles.length; i++) {
arr[i] = Arrays.copyOf(tiles[i], n);
}
// do some stuff
Board br = new Board(arr);
if(!this.equals(br)) {
q.add(new Board(arr));
}
}
if (x+1 < n) {
int [][]arr = new int[n][n];
for (int i = 0; i < tiles.length; i++) {
arr[i] = Arrays.copyOf(tiles[i], n);
}
// do some stuff
Board br = new Board(arr);
if(!this.equals(br)) {
q.add(new Board(arr));
}
}
return q;
}
基本上,我需要複製磚陣列和更改副本後,我得到這個錯誤「 ARR「,但保持瓷磚陣列不改變使用它以後..我真的不喜歡我做的方式複製和粘貼代碼我認爲它效率低下,但沒有其他方式來到我的腦海中,所以我想要知道爲什麼我得到這個錯誤「我知道它是因爲GC需要更多的時間而不做很多」,但我想知道爲什麼它發生在這種情況下,如果有更好的方法來複制數組。 也我增加了堆內存-Xmx1600m
感謝您的時間。
在這種情況下'n'有多大? – Compass
通過'new int [n] []'而不是'new int [n] [n]'初始化'arr',可以安全地完成一些GC工作。 – Socowi
@Compass n是3 –