Java ZeroMQ的Poller在堆中消耗越来越多的内存

时间:2018-03-26 15:06:38

标签: java zeromq jeromq

我有一个简单的应用程序,可以将数据从一台机器传输到另一台机器。随着应用程序的运行,堆的大小正在缓慢增加。所以我抛弃堆并对其进行分析,我发现 zmq.poll.Poller 花费了最大的内存。它们属于主题“iothread-2”:

The heap screenshot is here

enter link description here

我的应用程序演示是这样的:

public static void main(String[] args) throws Exception {
    ZMQ.Context context = ZMQ.context(1);
    ZMQ.Socket socket = context.socket(ZMQ.DEALER);
    socket.connect("tcp://localhost:5550");
    ZMQ.Poller poller = context.poller(1);
    poller.register(socket, ZMQ.Poller.POLLIN);

    while(!Thread.currentThread().isInterrupted()) {
        poller.poll(5000);
        if (poller.pollin(0)) {
            socket.send("message"); // send message to another machine
            String msg = socket.recvStr(); // get the reply

            // do some stuff
            Thread.sleep(1000);
        }
    }
}

当我检查堆中的Poller对象时,我发现有400万 HashMap$Node ,而hashmap节点的值是10个空对象数组的列表列表。

堆被命令转储:
jmap -dump:live,format=b,file=dump.hprof [pid]

jdk为1.8.0_131,OS为CentOS 7.2.1511,jeromq为0.4.2

我使用poller错了吗?非常感谢任何帮助过的人!

1 个答案:

答案 0 :(得分:2)

这个问题似乎与缺少资源管理有关:

Native API文档对此非常严格:

  

var ffmpeg = require('fluent-ffmpeg'); var fs = require('fs'); var write = fs.createWriteStream('output.flv'); ffmpeg('video.mov').format('flv').pipe(write, {end: true}); 函数应通知ØMQ基础结构与 zmq_msg_close()引用的消息对象关联的所有资源 不再需要,可能会被释放。与消息对象关联的资源的实际释放应由ØMQ推迟,直到消息或基础数据缓冲区的所有用户都表明不再需要它为止。

     

应用程序应确保在不再需要消息时调用 msg 否则可能会发生内存泄漏。 请注意,在成功 zmq_msg_close() 后,这不是必需的。

尝试包含适当的显式消息处理,并且应该看到改进(但是,取决于jeromq版本,垃圾收集动态等)。

相关问题