Java - 在内存不足时以编程方式减少应用程序负载

时间:2012-08-07 21:19:21

标签: java memory-management out-of-memory

不,真的,这就是我想要做的。服务器占用1600个用户 - 后端长时间运行的进程,而不是Web服务器 - 但有时用户生成的活动比平时多,所以需要减少负载,特别是当它耗尽“资源”时,这几乎就是堆内存。这是一个很大的设计问题 - 如何设计?

这可能涉及阻止OOM而不是从中恢复。理想地

   if(nearlyOutOfMemory()) throw new MyRecoverableOOMException();

可能会发生。

nearlyOutOfMemory()函数我真的不知道它可能是什么。

4 个答案:

答案 0 :(得分:3)

将服务器拆分为分片,每个分片占用较少的用户但驻留在不同的物理机器中。

如果你有很多缓存,请尝试使用软引用,当VM用完堆时会被清除。

在任何情况下,配置文件,配置文件,配置文件首先要查看消耗CPU时间的位置以及分配和保留内存。

答案 1 :(得分:1)

我实际上asked a similar question关于处理OOM,结果证明没有太多选项可以从中恢复。基本上你可以:

1)调用外部shell脚本(-XX:OnOutOfMemoryError="cmd args;cmd args"),这将触发一些操作。问题是如果OOM发生在一些没有合适的恢复策略的线程中,那你就注定了。

2)定义Old gen的阈值,技术上不是OOM,而是提前几步,比如80%,并且如果达到阈值则动作。更多详情here

答案 2 :(得分:1)

您可以使用Runtime.getRuntime()和以下方法:

但我同意其他海报,使用SoftReferenceWeakReferenceWeakHashMap可能会让您免于手动从该情况中恢复。

答案 3 :(得分:0)

限制,资源调节servlet过滤器也可能有用。我确实遇到过码头/日食的DoSFilter