我有一个简单的应用程序,可以将数据从一台机器传输到另一台机器。随着应用程序的运行,堆的大小正在缓慢增加。所以我抛弃堆并对其进行分析,我发现 zmq.poll.Poller
花费了最大的内存。它们属于主题“iothread-2
”:
我的应用程序演示是这样的:
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
错了吗?非常感谢任何帮助过的人!
答案 0 :(得分:2)
这个问题似乎与缺少资源管理有关:
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版本,垃圾收集动态等)。