我使用 OpenPGM 5.2.122 在 Windows 7 上的 MULTICAST 通道上为 ZeroMQ PUB 套接字发布数据在 java (JDK 7) 中编写了一个简单的测试。我在 ZeroMQ 3.2.3 之上尝试了 JZMQ 版本 2.2.0、2.1.3 和 2.1.0。测试文件如下。
import org.zeromq.ZMQ;
public class ZMQMulticastPubSocketTest
{
public static void main(String[] args)
{
ZMQ.Context ctx = ZMQ.context(1);
ZMQ.Socket pub = ctx.socket(ZMQ.PUB);
pub.setLinger(0);
pub.setRate(10000000);
pub.setSendBufferSize(24000000);
pub.connect("epgm://10.100.20.19;239.9.9.11:5556");
//pub.bind("tcp://*:5556");
while(true)
{
pub.sendMore("TESTTOPIC");
pub.send("Data_Data_Data_Data_Data_Data_Data_Data_Data_Data_Data_Data_Data_Data_Data_Data_Data_Data_Data_Data_".getBytes(), 0);
}
}
}
我注意到进程的内存占用不断增加,直到计算机内存不足。它不会崩溃(我确信 malloc() 失败是在内部处理的)。我还在我们的 linux 服务器上尝试过它,在我停止进程之前它一直消耗 22 GB 的内存。用于多播的 JZMQ 包装器中是否存在内存泄漏?
如果我将上面的代码更改为绑定到 TCP 地址(注释掉的行),内存占用保持稳定并且几乎没有增加。
我还编写了上述代码的 C 版本。这个版本在下面给出,它没有相同的多播内存占用问题。
#include "stdafx.h"
#include "zmq.h"
#include "zmq_utils.h"
#include <assert.h>
#include <string>
static int
s_send (void *socket, char *string) {
int size = zmq_send (socket, string, strlen (string), 0);
return size;
}
static int
s_sendmore (void *socket, char *string) {
int size = zmq_send (socket, string, strlen (string), ZMQ_SNDMORE);
return size;
}
int main(int argc, char* argv[])
{
void *context = zmq_ctx_new ();
void *publisher = zmq_socket (context, ZMQ_PUB);
int rc = zmq_bind (publisher, "epgm://10.100.20.19;239.9.9.11:5556");
assert (rc == 0);
long sockOpt = 1000000;
rc = zmq_setsockopt (publisher, ZMQ_RATE, &sockOpt, sizeof(sockOpt));
sockOpt = 0;
rc = zmq_setsockopt (publisher, ZMQ_LINGER, &sockOpt, sizeof(sockOpt));
sockOpt = 24000000;
rc = zmq_setsockopt (publisher, ZMQ_SNDBUF, &sockOpt, sizeof(sockOpt));
char* topic = "TESTTOPIC";
while(1)
{
s_sendmore(publisher, topic);
s_send(publisher, "Data_Data_Data_Data_Data_Data_Data_Data_Data_Data_Data_Data_Data_Data_Data_Data_Data_Data_Data_Data_");
}
return 0;
}
有谁知道为什么会发生这种情况?
谢谢。