Each instance of I has a variable "other" that holds a reference to another
instance of I.
So
Assigns the object reference i3 to i1's instance variable other. There by giving i1 a reference to the object currently referenced by i3.
Lets call the 4 objects created in these 2 lines O1, O2, O3, O4.
So at the end (before returning) of m1()
i1 is a reference to O1
i2 is a reference to O2
i3 is a reference to O3
i4 is a reference to O4
O1.other is a reference to O3
O3.other is a reference to O2
O2.other is a reference to O1
04.other is a reference to O4.
But after returning from m1() no live
thread has a reference to O1, O2, O3, or O4 so I would think they are all eligible for garbage collection. You don't keep a reference to the J object created, so its eligible also. If the program didn't terminate after the call to m1() the array object reference by args wouldn't be eligible for garbage collection.
Or did a somehow miss something?