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