До тех пор, пока исполнитель или объект Future
не содержат ссылку на него, является деталью реализации. Поэтому, если ваши задачи используют много памяти, так что вам приходится беспокоиться об использовании памяти, вы должны явно выполнить очистку в своей задаче до завершения задачи.
Если вы посмотрите на исходный код OpenJDK 1.6 для ThreadPoolExecutor
, вы можете видеть, что на самом деле базовый объект Future
фактически сохраняет ссылку на базовый вызываемый объект на неопределенный срок (т.е. до тех пор, пока поскольку существует сильная ссылка на объект Future
, вызываемый объект не может быть GCd). Это верно и для 1.7. Начиная с версии 1.8 ссылка на него обнуляется. Однако вы не можете контролировать, на какой реализации ExecutorService
будет выполняться ваша задача.
Использование WeakReference
должно работать на практике как Future
, и, таким образом, объект Callable
может быть GCd после выполнения задачи, а разумные реализации ExecutorService
должны терять ссылку на него, когда задача выполнена. Строго говоря, это все еще зависит от реализации ExecutorService. Кроме того, использование WeakReference может привести к неожиданно большим накладным расходам. Гораздо лучше просто явно очистить любой объект, который занимает много памяти. И наоборот, если вы не выделяете большие объекты, я бы не беспокоился.
Конечно, это обсуждение полностью отличается от утечки памяти, которая у вас будет, если вы продолжите добавлять фьючерсы в свой список, никогда не удаляя их. Если вы сделаете это, даже использование WeakReference
не поможет; у вас все равно будет утечка памяти. Для этого просто пройдитесь по списку и удалите фьючерсы, которые уже сделаны и поэтому бесполезны. Это действительно хорошо делать это каждый раз, если у вас нет смехотворно большого размера очереди, так как это очень быстро.
person
Enno Shioji
schedule
16.07.2014
Future
из списка, который называетсяrunningTasks
… - person Holger   schedule 11.04.2014Future
в списке. - person Holger   schedule 11.04.2014List<WeakReference<Future<?>>>
будет работать. Это позволит собратьFuture
, но вам придется вручную удалить экземплярWeakReference
(хотя самWeakReference
не занимает много места). Альтернативой может бытьCollections.newSetFromMap(new WeakHashMap<Future<?>,Boolean>())
для созданияSet<Future<?>>
, который позволяет собирать его элементы. Не может быть проще… - person Holger   schedule 11.04.2014