4

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

这可能涉及防止 OOM 而不是从中恢复。理想情况下

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

可能发生。

但是那个nearlyOutOfMemory()功能我真的不知道可能是什么。

4

4 回答 4

3

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

如果您有很多缓存,请尝试使用软引用,当虚拟机用完堆时,这些引用会被清除。

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

于 2012-08-07T21:25:42.863 回答
1

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

但我同意其他发帖者的观点,使用SoftReferenceWeakReferenceaWeakHashMap可能会让您免于手动从这种情况中恢复的麻烦。

于 2012-08-07T22:13:21.930 回答
1

我实际上已经问过一个关于处理 OOM 的类似问题,结果证明没有太多选择可以从中恢复。基本上你可以:

1) 调用外部 shell 脚本 ( -XX:OnOutOfMemoryError="cmd args;cmd args"),它会触发一些动作。问题是,如果 OOM 发生在某个没有像样的恢复策略的线程中,那么你注定要失败。

2)为老一代定义一个阈值,技术上不是OOM,而是提前几步,比如80%,如果达到阈值就采取行动。更多细节在这里

于 2012-08-07T21:33:26.133 回答
0

一个节流的、资源调节的 servlet 过滤器也可能有用。我确实遇到了码头/日食的DoSFilter

于 2012-08-07T21:31:00.897 回答