在开槽系统中的垃圾收集

时间:2013-11-11 01:24:15

标签: java garbage-collection

我有一个开槽的java系统,每2秒运行一次代码,每次运行时间不到100毫秒。我想避免在100ms运行期间运行垃圾收集,但是在系统空闲的剩余1.9s中运行它。 目前垃圾收集可能会在100毫秒内运行,并且会增加约100毫秒,这在我的情况下是不可接受的。

程序的内存使用量约为2G,在100ms内可能会创建许多小对象。我也在多核系统(4核以上)上运行它。

2 个答案:

答案 0 :(得分:1)

尝试-XX:+ UseParallelGC和-XX:+ UseOldParallelGC以最小化GC暂停。它专为多GB堆而设计,并在不同的线程上并行运行垃圾收集。它的目标是避免“停止世界”的收藏并尽量减少GS暂停。

答案 1 :(得分:1)

这看起来像calling System.gc() is useful时的少数情况。不能保证它会有所帮助,但它肯定值得一试。

您还可以尝试我最近提出的hack。它有点复杂,可能适得其反。

  • 在闲置期间分配大量内存。
  • 以这样的方式做到没有对象被提升到老一代(因为GC代价高昂)。
  • 确保无法优化整个分配(类似sum += new byte[123456].hashCode()应该这样做)
  • 当你已经分配足够的时间来启动GC时停止。这是棘手的部分:
    • 您可以使用终结器(或更好ReferenceQueue<PhantomReference>),但不能保证它会在GC后很快运行
    • 您可以观看runtime.getFreeMemory,但是谁知道它是否可靠运行?
    • 您可以尝试GarbageCollectorMXBean
    • 作为最后的手段,您可以使用-XX:+UnlockDiagnosticVMOptions -XX:+PrintGC从外面观看

正如我所说,对于没有理智的解决方案的情况来说,这只是一个黑客攻击。