Мне сложно отслеживать это, поскольку профайлер продолжает сбой (ошибка хот-спота). Прежде чем я углубится в это, я хотел бы знать, есть ли у меня проблема или нет :-)Ошибка утечки памяти ExecutorService
У меня есть несколько пулов потоков, созданных через: Executors.newFixedThreadPool (10); Нити подключаются к различным веб-сайтам, и иногда я получаю отказ в подключении и завершаю исключение.
Когда я позже позвонил в Future.get(), чтобы получить результат, он поймает исключение ExecutionException, которое обертывает исключение, которое было выбрано, когда соединение не было выполнено.
Программа использует довольно постоянное количество памяти до момента, когда исключаются исключения (они, как правило, происходят в партиях, когда определенный сайт перегружен). После этой точки память снова остается постоянной, но на более высоком уровне.
Итак, мой вопрос связан с тем, как поведение памяти (сообщается «сверху» в Unix) ожидается, потому что исключения только что вызвали что-то или у меня, вероятно, есть настоящая утечка, которую мне нужно будет отслеживать? Кроме того, когда Future.get() выдает исключение, есть что-то еще, что мне нужно сделать, кроме того, чтобы поймать исключение (например, вызвать на нем Future.cancel())?
РЕДАКТИРОВАТЬ: так что я действительно просмотрел с помощью нескольких инструментов, и с точки зрения Java нет ничего разумного в утечке памяти. Я буду играть с другим кодом, который живет долгое время, и через какое-то время выдает исключение и выясняет, увеличивается ли память, указанная в «верхнем». Похоже, это может быть какая-то странность.
Не имея ответа на вопрос о проблеме с исполнителем, могу сказать, что верхняя часть не является полезным способом диагностики проблем памяти в JVM (посмотрите параметры -Xmx и -Xms). Память, восстановленная в JVM на GC, не обязательно появится за ее пределами (я не думаю, что она когда-нибудь появится, но я не совсем уверен в этом). Для проверки памяти используйте Runtime.getRuntime(). TotalMemory() - Runtime.getRuntime(). FreeMemory(). –