>

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 서버에서 시도했으며 프로세스를 중단하기 전에 22GB의 램을 소비했습니다. 멀티 캐스트 용 JZMQ wwrapper에서 메모리 누수가 있습니까?

위의 코드를 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;
}

이 문제가 발생하는 이유를 아는 사람이 있습니까?

감사합니다.

  • 답변 # 1

    HWM (High Water Mark)을 설정해야합니다. 그렇지 않으면 응용 프로그램에 결국 메모리가 부족합니다.

  • 답변 # 2

    두 예제간에 약간의 차이가 있습니다. JZMQ 예제의 비율은 C의 경우 10,000,000 및 1,000,000입니다. 더 흥미로운 불일치는 Java에서 epgm : //10.100.20.19;239.9.9.11 : 5556에 연결하고 C에서 바인딩하는 것입니다.

    Java 예제에서 connect to bind를 변경해도 여전히 메모리 누수를 확인할 수 있습니까?

관련 자료

  • 이전 asp.net - ASHX 파일에서 세션 변수를 설정하는 방법
  • 다음 reactjs - React에서 고정 간격 후에 배열에서 항목 렌더링