以前用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/运维