【问题标题】:Java - programmatically reduce application load when runs out of memoryJava - 内存不足时以编程方式减少应用程序负载
【发布时间】:2012-08-07 21:19:20
【问题描述】:

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

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

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

可能会发生。

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

【问题讨论】:

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


【解决方案1】:

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

如果您有大量缓存,请尝试使用软引用,当 VM 用完堆时会清除它们。

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

【讨论】:

    【解决方案2】:

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

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

    2) 为老一代定义一个阈值,从技术上讲这不是 OOM,而是提前几步,比如 80%,如果达到阈值就采取行动。更多详情here.

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        也可以使用节流、资源调节的 servlet 过滤器。我确实遇到了jetty/eclipse的DoSFilter

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-11-09
          • 2011-11-04
          • 2016-03-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-17
          相关资源
          最近更新 更多