2012-08-07 64 views
4

不,實際上,這就是我想要做的。服務器持有1600個用戶 - 後端長時間運行的進程,而不是web服務器 - 但有時用戶產生比平時更多的活動,因此需要減少負載,特別是當它耗盡「資源」時意味着堆內存。這是一個很大的設計問題 - 如何設計?Java - 在內存不足時以編程方式減少應用程序負載

這可能涉及防止OOM而不是從它們中恢復過來。理想情況下

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

可能發生。

但那nearlyOutOfMemory()函數我真的不知道可能是什麼。

+0

這裏討論的東西類似http://stackoverflow.com/questions/11508310/detecting-out-of-memory-errors/11510049#11510049答案可能會有幫助 – Scorpion 2014-01-22 12:15:27

回答

3

將服務器拆分成碎片,每個碎片擁有較少的用戶,但駐留在不同的物理機器中。

如果您有很多緩存,請嘗試使用軟引用,當虛擬機用完堆時會將其清除。

在任何情況下,配置文件,配置文件,配置文件首先查看CPU時間消耗和內存分配和保存的位置。

0

節流,資源調節servlet過濾器也可能有用。我遇到了jetty/eclipse的DoSFilter

1

我實際上有asked a similar question關於處理OOM,事實證明,沒有太多選項可以從中恢復。基本上你可以:

1)調用外部shell腳本(-XX:OnOutOfMemoryError="cmd args;cmd args"),這將觸發一些行動。問題是,如果OOM發生在一些沒有體面的恢復策略的線程中,那麼你註定要失敗。

2)爲技術上不是OOM,而是提前幾步的Old gen定義一個閾值,例如80%,如果達到閾值則採取行動。更多詳情here