在 Java 中删除部分数组以释放堆内存
Posted
技术标签:
【中文标题】在 Java 中删除部分数组以释放堆内存【英文标题】:Deleting Part of An Array in Java to Free Memory on Heap 【发布时间】:2011-02-14 09:11:14 【问题描述】:我正在为 Java 中的背包问题实现一个动态编程算法。我声明了数组,然后将其大小初始化为[对象数][背包容量]。
当我的对象数量或容量太大时,我会收到内存错误,因为堆上的空间不足。我的问题是:如果我从我的双数组中删除行,Java 会在我删除时释放内存吗?或者 Java 是否为我最初创建的数组的大小保留了该内存空间?如果是后者,有没有办法在Java中手动释放内存?
感谢您的帮助!
【问题讨论】:
【参考方案1】:简短的回答是“是” - 如果您使用这样的数组:
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
【讨论】:
但是 JVM 不会将该内存返回给操作系统(至少在 Windows 中不会),但它会保留它以供将来使用(除非我理解错误,这不是 OP 需要的吗? - 嗯也许不是 - ) 我已经看到 JVM 将内存返回给操作系统 (Windows XP)。只有当大部分堆被释放时。【参考方案2】:它应该稍后释放内存,不一定是在删除行时。但是,它将将该内存重新用于新数据。
您可能正在运行小内存,请尝试使用以下方法增加它:
java -Xmx128m you.app.Main
这将使用 128 mb 的 RAM 运行您的应用程序。
【讨论】:
只要它可以将内存重新用于新数据,我应该没问题。我希望能够在删除旧行时添加新行。谢谢!【参考方案3】:是的,它有效。 Java 没有多维数组,只有锯齿状数组(数组的数组)。 所以第一个数组基本上只是一个指向真正内容数组的指针数组。
与将新数组分配给锯齿状区域之一相比,这具有积极的效果,旧的数组可以被垃圾收集。 (参见 Sbodd 的答案示例)
【讨论】:
【参考方案4】:不可能从数组的一部分中释放内存...因为在 java 中您不能从数组中删除元素...代替它您可以横向该数组然后存储到另一个所需大小的数组中... .
【讨论】:
以上是关于在 Java 中删除部分数组以释放堆内存的主要内容,如果未能解决你的问题,请参考以下文章