Jetty使用內存過大的解決方案

以前用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/運維

相關文章
相關標籤/搜索