我有一个简单的应用程序,可以将数据从一台机器传输到另一台机器。随着应用程序的运行,堆的大小正在缓慢增加。于是我dump了堆,分析了一下,发现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,操作系统是 CentOS 7.2.1511 和 jeromq 0.4.2
我用poller
错了吗?非常感谢任何帮助的人!