如何清除要进行垃圾收集的对象(HashMap)-Java

如何清除要进行垃圾收集的对象(HashMap)-Java,java,memory,memory-management,garbage-collection,hashmap,Java,Memory,Memory Management,Garbage Collection,Hashmap,所以我这里有一个java程序,它处理大量数据并将其存储到对象中(主要是散列映射)。在运行时的某个时刻,数据变得无用,我需要丢弃数据,以便释放一些内存 我的问题是,丢弃这些数据进行垃圾收集的最佳行为是什么 我尝试了map.clear(),但是这不足以清除映射分配的内存 编辑(添加我尝试过的备选方案) 我还尝试了system.gc()强制垃圾收集器运行,但是它没有帮助HashMap#clear将从HashMap中抛出所有条目,但是。这意味着您将有一个空的后备数组,其中(我猜在您的情况下)有容纳成千上

所以我这里有一个java程序,它处理大量数据并将其存储到对象中(主要是散列映射)。在运行时的某个时刻,数据变得无用,我需要丢弃数据,以便释放一些内存

我的问题是,丢弃这些数据进行垃圾收集的最佳行为是什么


我尝试了map.clear(),但是这不足以清除映射分配的内存

编辑(添加我尝试过的备选方案)

我还尝试了system.gc()强制垃圾收集器运行,但是它没有帮助

HashMap#clear将从HashMap中抛出所有条目,但是。这意味着您将有一个空的后备数组,其中(我猜在您的情况下)有容纳成千上万条条目的空间

如果不打算重用HashMap(数据量大致相同),只需丢弃整个HashMap实例(将其设置为
null

除上述内容外:

  • 如果映射的条目仍被系统的其他部分引用,则即使从映射中删除它们,也不会对它们进行垃圾收集(因为其他地方需要它们)
  • 垃圾收集在后台进行,并且仅在需要时进行。因此,您可能不会立即看到大量内存被释放,这可能不是问题
不建议使用,因为jvm应该是唯一负责所有垃圾收集的设备。在这种情况下使用
类WeakHashMap
。 如果密钥不再有效,对象将自动删除


内存未清除,则对象将变为未引用。如果您的程序需要更多内存,且内存不可用,则会发生垃圾收集,然后启动GC并回收所有未引用的对象。对于某些Java程序来说,GC很可能永远不会在程序运行时发生,因为不需要更多内存。“这不足以清除映射分配的内存”。你是怎么得出这个结论的?有道理。即使条目实例的引用泄漏(如果有)也不会影响性能+1:)因此,如果一个人使用了一个包含大量条目的hashmap,然后在程序中它变小了(很少条目的)但仍在使用,那么很可能应该使用复制构造函数将它复制到一个新的hashmap,而不是保留。对吧?我不知道。。。通常,程序有一些工作内存需求,释放一些几分钟后需要的内存似乎不是一个大的胜利。即使释放不再使用的内存,也不会真正让任何人受益。我不会担心这些事情,除非我正在处理大量的收藏品。如果是这样的话,也许需要一个更完整的解决方案(比如堆外存储)。你怎么知道WeakHashMap在这里是合适的呢?我很荣幸。。。为什么人们没有投票支持这个答案!??我认为WeakHashMap非常适合这种情况。不是吗??有人可以讨论一下吗???@MananShah好吧,如果你需要一个有序的hashmap,那么你应该使用LinkedHashMap,你不能总是使用一种hashmap,因为你可能需要另一种。
 system.gc()