一尘不染

有没有办法用Java计划完整垃圾回收?

java

我有一个按24x6时间表运行的应用程序。当前,运行几天后,会自动执行Full GC(通常在一天中的繁忙时间),这会对用户响应时间产生负面影响。

我想做的是强制使用Full
GC(也许是在每晚的午夜,在非常短的使用时间内),以防止它在白天发生。我已经尝试过System.gc(),但是它似乎无法保证何时会发生Full
GC,甚至不会发生。有这样做的方法吗?

版本信息:

Java™SE运行时环境(内部版本1.6.0_11-b03)
Java HotSpot™服务器VM(内部版本11.0-b16,混合模式)

另外-

  • 次要GC大约每10-15秒运行一次。但是这些都没有释放足够的内存来使应用程序运行一整周。当发生完全GC时,将释放近50%的堆。
  • 关于上述内容,调用System.gc()似乎并不意味着接下来的任何GC都将具有释放大量大块内存所需的Full形式。是的,它已启用(或不禁用,取决于您阅读-XX选项的方式)。
  • 我已经尝试了多个CMS GC设置,这些设置虽然有很大帮助,但并没有解决问题。最初,它是每周两次抛出OOM两次。
  • 我想停止无休止的循环:
    • 不断增加堆空间-只能持续这么长时间
    • 不断地调整和测试GC设置-远远超出了收益递减点
  • 我不想像一台NT机器那样对待它,并且每晚都将其弹回。整个晚上都有活跃的用户会话,而将应用程序弹开将意味着丢失会话数据。

更具体地说,我正在寻找一种可用于确保将发生Full GC的技术,而不是一种用于运行它的简单方法/函数。

目前,我正在查看CMS用于确定何时需要Full GC的百分比阈值的修改。

谢谢你的帮助。


阅读 310

收藏
2020-12-03

共1个答案

一尘不染

jmap -histo:live <PID>将强制使用Full GC作为查找所有活动对象的“副作用”。您可以安排它在下班时间回收JVM进程。

您的JVM build 1.6.0_11-b03很古老,但是jmap所有1.6 HotSpot JVM都应支持。

2020-12-03