【问题标题】:Deleting Part of An Array in Java to Free Memory on Heap在 Java 中删除部分数组以释放堆内存
【发布时间】:2011-02-14 09:11:14
【问题描述】:

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

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

感谢您的帮助!

【问题讨论】:

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


    【解决方案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 中您不能从数组中删除元素...代替它您可以横向该数组然后存储到另一个所需大小的数组中... .

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-15
        • 2013-02-28
        • 2011-11-05
        • 1970-01-01
        • 2016-07-25
        • 2016-08-19
        相关资源
        最近更新 更多