以前用Jetty作過一個消息通知服務器,主要功能就是其餘各個子系統若是有須要push給客戶端消息的就把這個消息發給個人Server,我用WebSocket來推送給客戶端~
程序上線一段時間以後運維工程師找到我說個人程序佔用了16G內存,個人個乖乖,記得設置Xmx爲2G的,爲麼吃掉了這麼大的內存呢??!!
通過一番測試,發現用的並非應用內存,而是系統的內存,這些內存不歸應用管,而歸JVM管~~
jetty使用的是java的nio ,nio在請求分配bytebuffer時有二種,一種是分配應用內存,一種是分配系統內存~~
若是是嵌入式的方式啓動的Server,加上這麼兩行代碼便可。
SelectChannelConnector conn = new SelectChannelConnector();
conn.setUseDirectBuffers(false);java
另外,找到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/運維