我有一个提供Websocket服务的 Vert.x Web服务器。当客户端在服务器上注册时, Vert.x 服务器向客户端发送一些数据,然后客户端将ACK发送回服务器,以确保这些数据已经可靠地传送。
我发现 Vert.x 服务器在完成所有工作后会消耗大量内存。
以下是重现此问题的步骤:
VertXSocketClient
vertx run testserver.java
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
vertx run VertXSocketClient.java
客户端将自动注册到websocket通道服务器,服务器实例将在注册完成后向客户端发送数据。
此处向下发送数据到客户端的示例代码:
byte[] serverResponseData = serverResponse.getBytes();
Buffer buffer= new Buffer(serverResponseData);
ws.write(buffer);
使用上面的代码,在完成所有工作后,使用的内存最多可达 62MB ,如果我注释掉ws.write(buffer)
,那么它最多只能 15MB
我的假设是 Vert.x 服务器总是在其生命周期内留出 62MB 的内存。在工作完成后它不应该释放内存吗?
答案 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。