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, динамики сборки мусора и др.).

Другие вопросы по тегам