我有一个按照24x6的时间表运行的应用程序。目前,在运行了几天之后,会自动执行一次Full GC(全堆垃圾回收),通常在一天中繁忙的时间段进行,这会对用户响应时间产生负面影响。
我想要做的是强制执行Full GC - 可能是每天午夜期间,即非常低的使用率时间 - 以防止它在白天发生。我尝试过System.gc(),但它似乎不能保证何时进行Full GC,甚至是否进行。有什么方法可以做到这一点吗?
版本信息:
Java(TM) SE Runtime Environment (build 1.6.0_11-b03)
Java HotSpot(TM) Server VM (build 11.0-b16, mixed mode)
此外,
- Minor GC每10-15秒运行一次。但这些并没有释放足够的RAM来使应用程序通过整个星期。当进行Full GC时,近50%的堆被释放。
- 与上述内容相关,调用System.gc()似乎并不意味着下一次GC将是所需的Full形式,以释放那些大块的内存。是的,它已启用(或未禁用,具体取决于如何阅读-XX选项)。
- 我已经尝试了几种CMS GC设置,这大大有所帮助,但并没有解决问题。最初,它每周会抛出两到三次OOM(内存溢出)。
- 我想停止无休止的循环:
- 不断添加到堆空间 - 只能持续一段时间
- 不断调整和测试GC设置 - 已远远超过收益递减点
- 我不想像处理NT机器那样每晚都强制关闭。夜间仍有活跃的用户会话,并且关闭应用程序将意味着丢失会话数据。
更具体地说,我正在寻找更多的技巧来确保Full GC将发生,而不是简单地调用运行它的方法/函数。
目前我正在研究 CMS 使用的百分比阈值的修改,以确定何时需要进行 Full GC。
感谢任何帮助。