删除Java中的一部分数组以释放堆内存

时间:2010-04-30 19:29:20

标签: java arrays memory-management garbage-collection heap

我正在为Java中的背包问题实现动态编程算法。我声明了数组,然后将其大小初始化为[对象数] [背包的容量]。

当我的对象数量或容量变得太大时,我收到内存错误,因为堆上的空间不足。我的问题是:如果我继续删除双数组中的行,Java会在删除时释放内存吗?或者Java是否保留了我最初创建的数组大小的内存空间?如果是后者,有没有办法在Java中手动释放内存?

感谢您的帮助!

4 个答案:

答案 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中你不能从数组中删除元素..而不是它你可以横向该数组而不是存储到另一个所需大小的数组中......