java - 在多播上发布时,ZeroMQ 3.2.3 之上的 JZMQ 2.x.x 是否存在内存泄漏?

标签 java c memory-leaks zeromq jzmq

我使用 OpenPGM 5.2.122 在 Java (JDK 7) 中针对 ZeroMQ PUB 套接字通过 Windows 7 上的 MULTICAST channel 发布数据编写了一个简单的测试。我在 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 wwrapper 中是否存在内存泄漏?

如果我更改上面的代码以绑定(bind)到 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;
}

有人知道为什么会发生这种情况吗?

谢谢。

最佳答案

确保设置高水位线 (HWM),否则您的应用程序最终会耗尽内存。

关于java - 在多播上发布时,ZeroMQ 3.2.3 之上的 JZMQ 2.x.x 是否存在内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17158217/

相关文章:

java - 使用 EntityUtils.consume(httpEntity) 消费直到流结束如何导致将连接释放回连接池?

java - Android ksoap2 通过 https

c++ - 在 C/C++ 中创建新的证书存储

将有符号定点转换为 float

c - 为什么我的函数有时会进入无限循环?

java - Thymeleaf 获取当前语言环境

java - Maven 项目有哪些额外的目录约定?

c - 数据不存储在结构中

c - cuda程序内存泄漏

memory-leaks - ANTLR4内存清理