Myślę, że mam wyciek pamięci w moim Android tapety na żywo. Za każdym razem, gdy obracam ekran, ilość zebranych śmieci pamięci rośnie o 50 kb i nie spada. Myślę, że może to być spowodowane zaplanowaną przyszłością, więc przedstawię scenariusz, aby zobaczyć, czy tak jest.Czy zaplanowana przyszłość może spowodować wyciek pamięci?
Załóżmy, że masz klasę (nazwijmy ją Foo), która ma następujących członków.
private ScheduledFuture<?> future;
private final ScheduledExecutorService scheduler = Executors
.newSingleThreadScheduledExecutor();
private final Runnable runnable = new Runnable() {
public void run() {
// Do stuff
}
};
A teraz ustawić zaplanowaną przyszłość
future = scheduler.scheduleAtFixedRate(runnable, delay, speed,
TimeUnit.MILLISECONDS);
Przyszłość posiada odniesienie do runnable i runnable posiada odniesienie do dominującej Foo obiektu. Nie jestem pewien, czy tak jest, ale czy ten fakt może oznaczać, że jeśli nic w programie nie zawiera wzmianki o Foo, śmieciarz nadal nie może go odebrać, ponieważ jest zaplanowana przyszłość? Nie jestem zbyt dobry w wielowątkowości, więc nie wiem, czy kod, który pokazałem, oznacza, że zaplanowane zadanie będzie żyło dłużej niż obiekt, co oznacza, że nie będzie to śmieci.
Jeśli ten scenariusz nie spowoduje, że Foo nie zostanie usunięte, wystarczy, że otrzymam proste wyjaśnienie. Jeśli to uniemożliwi Foo ze zbierania śmieci, to jak mogę to naprawić? Czy musisz zrobić future.cancel(true); future = null;
? Czy część future = null
jest niepotrzebna?
Moja metoda uruchamiania opiera się na zamkniętej klasie Foo. Ale kiedy wcześniej zniszczę odniesienie do obiektu Foo, co powinienem zrobić, aby powstrzymać działanie, które może spowodować wyciek pamięci. Czy 'future.cancel (true)' będzie wystarczające? Robię to już i przeciek pamięci wciąż tam jest. Oczywiście może to oznaczać, że runnable nie jest źródłem wycieku. – gsingh2011
@ gsingh2011 czy jesteś pewien, że 'future.cancel (true)' anuluje twoją przyszłość? Innymi słowy, czy twoja praca może zostać przerwana i czy przerwie ona pracę, kiedy zostanie przerwana? – assylias
Ponieważ nie rozumiem, co oznacza "można przerwać działanie", zakładam, że nie można go przerwać. Jak mam to zrobić? – gsingh2011