Poller из Java ZeroMQ потребляет все больше памяти в куче
У меня есть простое приложение, которое передает данные с одной машины на другую. По мере запуска приложения размер кучи медленно увеличивается. Поэтому я свалил кучу и проанализировал ее, и обнаружил, что 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
Объекта в куче я обнаружил там 4 миллиона 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
неправильно? Большое спасибо всем, кто помогает!
1 ответ
Эта проблема, скорее всего, связана с отсутствующим управлением ресурсами:
Собственная документация API строго по этому вопросу:
zmq_msg_close()
Функция должна информировать инфраструктуру ØMQ о том, что любые ресурсы, связанные с объектом сообщения, на который ссылаетсяmsg
больше не требуются и могут быть освобождены. Фактическое освобождение ресурсов, связанных с объектом сообщения, должно быть отложено ØMQ до тех пор, пока все пользователи сообщения или нижележащего буфера данных не укажут, что он больше не требуется.Приложения должны гарантировать, что
zmq_msg_close()
вызывается, когда сообщение больше не требуется, в противном случае возможна утечка памяти. Обратите внимание, что это НЕ обязательно после успешногоzmq_msg_send()
,
Попытайтесь включить правильное явное удаление сообщений и увидите улучшение (однако, это зависит от версии jeromq, динамики сборки мусора и др.).