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

Java—在内存不足时以编程方式减少应用程序负载,java,memory-management,out-of-memory,Java,Memory Management,Out Of Memory,不,真的,这就是我想做的。服务器拥有1600个用户——后端长时间运行的进程,而不是web服务器——但有时用户会产生比平时更多的活动,所以它需要降低负载,特别是当“资源”用完时,这几乎意味着堆内存。这是一个很大的设计问题——如何设计 这可能涉及预防OOM,而不是从中恢复。理想的 if(nearlyOutOfMemory()) throw new MyRecoverableOOMException(); 可能会发生 但是,我不知道这是什么功能。将服务器分割成碎片,每个碎片容纳的用户较少,但驻

不,真的,这就是我想做的。服务器拥有1600个用户——后端长时间运行的进程,而不是web服务器——但有时用户会产生比平时更多的活动,所以它需要降低负载,特别是当“资源”用完时,这几乎意味着堆内存。这是一个很大的设计问题——如何设计

这可能涉及预防OOM,而不是从中恢复。理想的

   if(nearlyOutOfMemory()) throw new MyRecoverableOOMException();
可能会发生


但是,我不知道这是什么功能。

将服务器分割成碎片,每个碎片容纳的用户较少,但驻留在不同的物理机器中

如果有很多缓存,请尝试使用软引用,当VM耗尽堆时,软引用将被清除


在任何情况下,profile、profile、profile都会首先查看CPU时间在哪里消耗,内存在哪里分配和保持。

一个节流、资源调节的servlet过滤器也可能有用。我确实遇到过jetty/eclipse。

我实际上已经了解了如何处理OOM,结果发现没有太多的选项可以从中恢复。基本上你可以:

1) 调用外部shell脚本(
-XX:OnOutOfMemoryError=“cmd args;cmd args”
),该脚本将触发某些操作。问题是,如果OOM发生在某个线程中,而该线程没有合适的恢复策略,那么你就注定要失败

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

您可以使用和以下方法:


但是我同意其他的海报,使用
SoftReference
WeakReference
WeakHashMap
可能会避免手动恢复的麻烦。

这里讨论的类似问题答案可能会有所帮助