Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Garbage collection when final variables used in anonymous classes

If I have code similar to the following:

public Constructor(final Object o) {
    taskSystem.add(new CycleTask(15, 15, -1) {

        @Override
        public void execute() throws Throwable {
            //access o here every 15 cycles forever
        }
    });
}

When would o be garbage collected, if ever? Only when the task has been collected, or will it remain in memory forever because it's final?

like image 566
Colby Avatar asked May 31 '12 21:05

Colby


2 Answers

o might get garbage collected once it is not reachable any longer, whether it is final or not. Obviously, as long as execute is running, if it needs to access o, it will prevent GC.

When execute is done running, and assuming you have not stored any references to o (for example in a collection), it will be flagged as ready for garbage collection.

like image 60
assylias Avatar answered Sep 23 '22 19:09

assylias


When the anonymous class instance becomes eligible for garbage collection, if nothing else refers to the object that o referred to when the method was called, that object will become eligible for garbage collection.

There's nothing special about final variables which deters garbage collection.

like image 45
Jon Skeet Avatar answered Sep 20 '22 19:09

Jon Skeet