java - 如何估计调用 System.gc() 时剩余的内存量?

标签 java memory-management garbage-collection

我有一些使用以下配方的数据处理代码:

  • 尽可能多地读入内存中的数据(称之为“ block ”)
  • 对 block 进行处理
  • 将处理后的 block 写入磁盘
  • 重复
  • ...
  • 合并所有处理过的 block 以获得最终答案。

当 block 尽可能少时,最后一个阶段是最有效的,所以我希望第一阶段读入尽可能多的数据以适合内存。我可以通过查询 Runtime.freeMemory() 来做到这一点.

但是,这意味着我需要调用 System.gc() ,或者 Runtime.freeMemory() 返回的数字远小于我可以安全分配的内存量。

我听很多权威人士说显式调用 System.gc() 是个坏主意。有什么办法可以避免这种情况吗?

最佳答案

即使您在检查您有多少内存之前立即调用 System.gc(),也不能保证垃圾收集实际上已经发生。我自己真的不会打扰,我会设置一个固定的 block 大小(最好通过属性或类似的配置)并始终使用它。如果您的程序的其余部分足够简单,您可以只使用 block 大小加上固定数量的兆作为堆大小。如果您的程序大小由于其他原因太不确定,您可以考虑并排运行两个程序并使用 IPC 机制。

当然,您的代码很可能需要对内存进行更细粒度的控制,但我谦虚地建议您当时使用了错误的语言;或者至少是错误的运行时(那里有 RT java 产品,我认为它们更适合这类事情)。

如果这看起来不是最有用的答案,我很抱歉,但基本上我想知道您是否真的需要这个?

关于java - 如何估计调用 System.gc() 时剩余的内存量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1147511/

相关文章:

objective-c - NSView * 实例变量的 Obj-C 内存管理

c++ - 缓慢的 SLAB/SLUB 内存分配

memory - 垃圾收集语言是否可以编译为非垃圾收集语言,而不在运行时包含垃圾收集器?

java - 在 Berkeley DB Core 和 Berkeley DB JE 之间进行选择

Java 函数作为参数

java - Arraylist 的 Arraylist 的通用类型

memory-management - 垃圾收集器收集堆栈内存、堆内存还是两者兼而有之?

java - 使用类型化类和 rdf 创建 RDF 模型 :id

c# - 为什么在 C# 中重用数组可以显着提高性能?

performance - ParallelGCFailedAllocation 的大 'sync' 值