我正在为Java中的背包问题实现动态编程算法。我声明了数组,然后将其大小初始化为[对象数] [背包的容量]。
当我的对象数量或容量变得太大时,我收到内存错误,因为堆上的空间不足。我的问题是:如果我继续删除双数组中的行,Java会在删除时释放内存吗?或者Java是否保留了我最初创建的数组大小的内存空间?如果是后者,有没有办法在Java中手动释放内存?
感谢您的帮助!
答案 0 :(得分:5)
简短的回答是“是” - 如果你使用这样的数组:
private void foo () {
int[][] bar = new int[10][10];
bar[1] = null;
//at this point, the array that was in bar[1] is eligible for garbage collection
//unless someone else has a reference to it
}
答案 1 :(得分:1)
它应该稍后释放内存,不一定要删除行。然而,它会将该内存重用于新数据。
可能你正在使用小型ram运行,尝试使用以下方法增加它:
java -Xmx128m you.app.Main
这将使用128 MB RAM运行您的应用程序。
答案 2 :(得分:1)
是的,它有效。 Java没有多维数组,只有锯齿状数组(数组数组)。 所以第一个数组基本上只是指向真实内容数组的指针数组。
除了将一个新数组分配给其中一个锯齿状区域之外,它具有正面效果,旧的数组可以被垃圾收集。 (参见Sbodd回答的一个例子)
答案 3 :(得分:1)
不可能从数组的一部分释放内存...因为在java中你不能从数组中删除元素..而不是它你可以横向该数组而不是存储到另一个所需大小的数组中......