如何通过调用System.gc()来估计剩余内存量?

15 浏览
0 Comments

如何通过调用System.gc()来估计剩余内存量?

我有一些用以下步骤处理数据的代码:

  • 读取尽可能多的数据放入内存(称其为“块”)
  • 对块进行处理
  • 将处理后的块写入磁盘
  • 重复以上步骤
  • ...
  • 将所有处理过的块合并以获取最终答案。

在最后一个阶段,当块数越少时效率越高,因此我希望第一阶段读入尽可能多的数据放入内存。我可以通过查询Runtime.freeMemory()来实现这一点。

然而,这意味着我需要调用System.gc(),否则Runtime.freeMemory()返回的数字将比我可以安全分配的内存要小得多。

我听说过很多权威人士说,显式地调用System.gc()是一个不好的做法。 有没有办法可以避免这种情况?

admin 更改状态以发布 2023年5月24日
0
0 Comments

调用System.gc()是一个不好的主意的原因最有可能是因为它不保证任何事情。调用System.gc()是一个不好主意的真正的原因是,JVM最擅长知道运行GC的最佳时间;也就是当堆被填满时。如果你在其他时间调用System.gc(),你告诉JVM做一些昂贵和浪费的事情。\n\n回到最初的问题,我认为最好的解决方案是不要试图编写应用程序来猜测内存分配器。相反,编写应用程序,使块大小成为命令行参数/系统属性/任何其他参数,并手动调整块大小与JVM内存大小。您可能还要确保JVM的初始和最大内存大小相同。

0
0 Comments

即使在查询剩余内存之前调用System.gc(),也不能保证垃圾回收实际上已经发生。我个人认为不需要这么麻烦,我会设置一个固定的块大小(最好通过属性或类似配置)并始终使用它。如果程序的其余部分足够简单,可以将块大小加上固定的几兆字节作为堆大小使用。如果由于其他原因程序的大小不确定,可以考虑运行两个并排运行的程序并使用IPC机制。当然,如果您的代码需要更精细的内存控制,那么我会谦虚地建议您正在使用错误的语言;或者至少是使用错误的运行时(有RT java产品可用,我认为它们更适合这种情况)。如果这看起来不是最有用的答案,那么我很抱歉,但基本上我在想您是否真的需要这个?

0