在 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 中删除部分数组以释放堆内存的主要内容,如果未能解决你的问题,请参考以下文章

Java中的堆内存和栈内存

如何为二维数组分配和释放堆内存?

java类中成员变量初始化后存放在堆内存中还是栈内存中?

Java中堆内存和栈内存详解

Java中堆内存和栈内存详解

Java中堆内存和栈内存详解2