我有一些使用以下配方的数据处理代码:
- 读入内存中尽可能多的数据(称之为“块”)
- 对 chunk 进行处理
- 将处理后的块写入磁盘
- Repeat
- ...
- 合并所有处理过的块以获得最终答案。
当块尽可能少时,最后一个阶段的效率最高,因此我希望第一阶段读入内存中尽可能多的数据。我可以通过查询来做到这一点Runtime.freeMemory() http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runtime.html#freeMemory().
然而,这意味着我需要打电话System.gc() http://java.sun.com/j2se/1.4.2/docs/api/java/lang/System.html#gc(),或返回的数字Runtime.freeMemory()
比我可以安全分配的内存量小得多。
我听到很多权威人士表示,打电话System.gc()
明确地是一个坏主意。有什么办法可以避免这种情况吗?
即使您在检查拥有多少内存之前调用 System.gc(),也不能保证垃圾收集实际上会发生。我自己真的不会打扰,我会设置一个固定的块大小(最好通过属性或类似的配置)并始终使用它。如果程序的其余部分足够简单,则可以仅使用块大小加上固定数量的兆作为堆大小。如果由于其他原因程序的大小太不确定,您可以考虑并行运行两个程序并使用 IPC 机制。
当然,您的代码很可能需要对内存进行更细粒度的控制,但我谦虚地建议您使用错误的语言;或者至少是错误的运行时(有 RT java 产品,我认为它们更适合此类事情)。
如果这看起来不是最有用的答案,我很抱歉,但基本上我想知道您是否真的需要这个?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)