之前用Jetty做過一個消息通知服務器,主要功能就是其他各個子系統如果有需要push給客戶端消息的就把這個消息發給我的Server,我用WebSocket來推送給客戶端~
程序上線一段時間之后運維工程師找到我說我的程序占用了16G內存,我的個乖乖,記得設置Xmx為2G的,為么吃掉了這么大的內存呢??!!
經過一番測試,發現用的並不是應用內存,而是系統的內存,這些內存不歸應用管,而歸JVM管~~
jetty使用的是java的nio ,nio在請求分配bytebuffer時有二種,一種是分配應用內存,一種是分配系統內存~~
如果是嵌入式的方式啟動的Server,加上這么兩行代碼即可。
SelectChannelConnector conn = new SelectChannelConnector();
conn.setUseDirectBuffers(false);
另外,找到Jetty的配置文件,把這個配置寫在配置文件里也是OK的~
<Call name="addConnector"> <Arg> <New class="org.eclipse.jetty.server.nio.SelectChannelConnector"> <Set name="host"><Property name="jetty.host" /></Set> <Set name="port"><Property name="jetty.port" default="8877"/></Set> <Set name="maxIdleTime">300000</Set> <Set name="Acceptors">2</Set> <Set name="statsOn">false</Set> <Set name="confidentialPort">8443</Set> <Set name="useDirectBuffers">false</Set> <Set name="lowResourcesConnections">20000</Set> <Set name="lowResourcesMaxIdleTime">5000</Set> </New> </Arg> </Call>
原文鏈接:http://www.coderroad.com/blog/15/
