Java Programming - Garbage Collections

Exercise : Garbage Collections - Pointing out the correct statements
1.
Which statement is true?
Programs will not run out of memory.
Objects that will never again be used are eligible for garbage collection.
Objects that are referred to by other objects will never be garbage collected.
Objects that can be reached from a live thread will never be garbage collected.
Answer: Option
Explanation:

Option D is correct.

Option C is wrong. See the note above on Islands of Isolation (An object is eligible for garbage collection when no live thread can access it - even though there might be references to it).

Option B is wrong. "Never again be used" does not mean that there are no more references to the object.

Option A is wrong. Even though Java applications can run out of memory there another answer supplied that is more right.


2.
Which statement is true?
All objects that are eligible for garbage collection will be garbage collected by the garbage collector.
Objects with at least one reference will never be garbage collected.
Objects from a class with the finalize() method overridden will never be garbage collected.
Objects instantiated within anonymous inner classes are placed in the garbage collectible heap.
Answer: Option
Explanation:

All objects are placed in the garbage collectible heap.

Option A is incorrect because the garbage collector makes no guarantees.

Option B is incorrect because islands of isolated objects can exist.

Option C is incorrect because finalize() has no such mystical powers.


3.
Which statement is true?
Memory is reclaimed by calling Runtime.gc().
Objects are not collected if they are accessible from live threads.
An OutOfMemory error is only thrown if a single block of memory cannot be found that is large enough for a particular requirement.
Objects that have finalize() methods always have their finalize() methods called before the program ends.
Answer: Option
Explanation:

Option B is correct. If an object can be accessed from a live thread, it can't be garbage collected.

Option A is wrong. Runtime.gc() asks the garbage collector to run, but the garbage collector never makes any guarantees about when it will run or what unreachable objects it will free from memory.

Option C is wrong. The garbage collector runs immediately the system is out of memory before an OutOfMemoryException is thrown by the JVM.

Option D is wrong. If this were the case then the garbage collector would actively hang onto objects until a program finishes - this goes against the purpose of the garbage collector.


4.
Which statement is true?
Calling Runtime.gc() will cause eligible objects to be garbage collected.
The garbage collector uses a mark and sweep algorithm.
If an object can be accessed from a live thread, it can't be garbage collected.
If object 1 refers to object 2, then object 2 can't be garbage collected.
Answer: Option
Explanation:

This is a great way to think about when objects can be garbage collected.

Option A and B assume guarantees that the garbage collector never makes.

Option D is wrong because of the now famous islands of isolation scenario.