Java中的优雅降级以避免内存不足错误

在突发内存密集型请求期间,可以使用哪些工具或最佳实践来优雅地降级
Java服务中的服务?有问题的应用程序是多线程的.处理每个请求所需的工作量可能差异很大,并且不容易拆分和并行化.

我担心编写与堆使用和GC有关的应用程序级代码,但我们发现应用程序可以通过承担多个密集请求来解决问题,即内存不足错误或完整GC.通常,完整的GC无法找到任何可用的内存.

长话短说:我正在考虑增加一些限制或排队功能来预防这类问题.

任何想法或建议表示赞赏.

最佳答案 正如joeslice所说,通过简单的资源池实现限制.在最基本的层面上,这是一个信号量 – 你的工作线程需要在处理请求之前获得许可.既然你说你有异构任务,你可能希望许可证稍微复杂一些,例如获得与工作规模成比例的一些许可证.

在过去,我发现这并不总是有效.假设你的启发式关闭,你的应用程序无论如何都会抛出一个OOM.重要的是要防止进程在糟糕的状态中徘徊,因此请立即终止并重新启动进程.有一些方法可以注意到OOM何时发生,例如见java out of memory then exit.

点赞