不,真的,这就是我想要做的。服务器占用1600个用户 - 后端长时间运行的进程,而不是Web服务器 - 但有时用户生成的活动比平时多,所以需要减少负载,特别是当它耗尽“资源”时,这几乎就是堆内存。这是一个很大的设计问题 - 如何设计?
这可能涉及阻止OOM而不是从中恢复。理想地
if(nearlyOutOfMemory()) throw new MyRecoverableOOMException();
可能会发生。
但nearlyOutOfMemory()
函数我真的不知道它可能是什么。
答案 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()
和以下方法:
但我同意其他海报,使用SoftReference
,WeakReference
或WeakHashMap
可能会让您免于手动从该情况中恢复。
答案 3 :(得分:0)
限制,资源调节servlet过滤器也可能有用。我确实遇到过码头/日食的DoSFilter。