提高Vert.x服务器的内存使用率

时间:2014-08-13 02:09:06

标签: java memory vert.x

我有一个提供Websocket服务的 Vert.x Web服务器。当客户端在服务器上注册时, Vert.x 服务器向客户端发送一些数据,然后客户端将ACK发送回服务器,以确保这些数据已经可靠地传送。

我发现 Vert.x 服务器在完成所有工作后会消耗大量内存。

以下是重现此问题的步骤:

    在开始测试之前,
  1. 配置 JVM 参数:
    • 打开/vert.x-2.02-final/bin/
    • 将JVM_OPTS的值从“”修改为“-Xms128M -Xmx128M”
    • 保存并将{默认 serverIpAddress 保存到VertXSocketClient
    • 中的服务器IP地址
  2. 客户端将在 Vert.x 服务器上注册 1180 websocket频道。 你可以在这里获得代码: https://www.dropbox.com/s/ptenlx78iin8dmj/VertXSocketClient.java
  3. 使用命令vertx run testserver.java
  4. 运行 testserver

    Vert.x 服务器的内存使用情况将在您的控制台中打印出来,格式为:

    总内存 - 空闲内存=已用内存(MB)

    System.gc()    
    Runtime runtime = Runtime.getRuntime();
    int mb = 1024 * 1024;
    totalMemory = runtime.totalMemory() / mb;
    freeMemory = runtime.freeMemory() / mb;
    

    我每5秒调用一次System.gc()以确保释放内存。是的我知道。不应经常调用System.gc()。它对系统性能有负面影响。没有这样的指令,使用的内存不会减少。

    您可以在此处下载代码: https://www.dropbox.com/sh/6oxtfhgwffed72c/AAAX-BvYdGaTBgnRagxD9Bf-a/TestServer.java

    1. 使用命令vertx run VertXSocketClient.java
    2. 运行 VertXSocketClient

      客户端将自动注册到websocket通道服务器,服务器实例将在注册完成后向客户端发送数据。

      此处向下发送数据到客户端的示例代码:

      byte[] serverResponseData = serverResponse.getBytes();
      Buffer buffer= new Buffer(serverResponseData);  
      ws.write(buffer);
      

      使用上面的代码,在完成所有工作后,使用的内存最多可达 62MB ,如果我注释掉ws.write(buffer),那么它最多只能 15MB

      我的假设是 Vert.x 服务器总是在其生命周期内留出 62MB 的内存。在工作完成后它不应该释放内存吗?

1 个答案:

答案 0 :(得分:0)

如果您使用的是Vert.x,请务必检查Hazelcast map配置。也许它与您的问题和Vert.x使用无关,但我在内存使用方面遇到了类似的问题,发现我的配置(在cluster.xml中)不适合我的用例。

您应该在Hazelcast配置中查看一些要点:

  • backup-count - 默认情况下,Hazelcast有一个同步备份副本
  • time-to-live-seconds - 默认情况下,每个地图条目在地图中保留的最长时间(以秒为infinite
  • max-idle-seconds - 默认情况下,每个条目在地图中保持空闲的最长时间为0(infinite
  • 默认情况下使用
  • eviction-policy - NONE地图驱逐政策

有关详细信息,请参阅Hazelcast Map documentation